星期四, 12月 29, 2016

[Objective-C] Youtube Oauth2 實作

記錄一下第一次寫iOS如何與Youtube Oauth2串接

首先要申請API KEY跟Oauth要用的Client ID


Oauth2的驗證url記錄 

https://accounts.google.com/o/oauth2/auth?client_id=<你的CLIENTID>.apps.googleusercontent.com&redirect_uri=http://localhost&scope=https://www.googleapis.com/auth/youtube&response_type=code&access_type=offline

403的爆炸

用webview直接丟Oauth2的連結,google會爆給你不允許存取的403 (disallowed_user-agent)



所以改用NSURLSession來處理request,在把結果丟給webview來呈現
成功後你會取得一個auth code: 例如


http://localhost/oauth2callback?code=


如何取得Access Token (Exchange authorization code for refresh and access tokens)


拿到code之後就要去換access token了,換打以下網址
POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code=4/ux5gNj-_mIu4DOD_gNZdjX9EtOFf&
client_id=1084945748469-eg34imk572gdhu83gj5p0an9fut6urp5.apps.googleusercontent.com&
client_secret=hDBmMRhz7eJRsM9Z2q1oFBSe&
redirect_uri=http://localhost/oauth2callback&
grant_type=authorization_code
以下二點注意:

1. 請注意content-type用錯會噴400的invalid request給你看,另外post送出去的參數未正確用url encode也會無法正常解析。

2. iOS OAuth是不用帶 client_secret才對,因為只有web 應用程式才會派發client_secret

成功的話就會拿到以下的東西

{
  "access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
記得把Access Token跟Refresh Token保存好,不然逾時後沒辦法重新刷token,又要跑一次Oauth的流程

驗證token有沒有逾期


打以下的api會跟你講api token的狀況
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=

{

"issued_to": "xxxxxxxxx.apps.googleusercontent.com",

"audience": "xxxxxxxxx.apps.googleusercontent.com",

"scope": "https://www.googleapis.com/auth/youtube",

"expires_in": 3578,

"access_type": "offline"

}

一些遇到爆炸的情況

Invalid request

通常會遇到content-type送不對的話會噴

Code was already redeemed.
如果token失效再呼叫會噴

其他資源
GoogleAPI的遊樂場,api打不成功可以來這裡玩一下
https://code.google.com/oauthplayground/


沒有留言:

張貼留言

留個話吧:)

其他你感興趣的文章

Related Posts with Thumbnails