Tuesday, June 21, 2011

Facebook: authentication and error handling

認證的種類
1. server-side flow: 指令由自己的server端發出
2. client-side flow: 指令由client端發出(ex: 瀏覽器, 手機app, 桌面app)

認證三步驟
1. 使用者認證(user authentication)
- 顯示接下來希望能獲得授權的app名稱, 並且讓使用者輸入帳號密碼來驗證身分

2. app授權(app authorization)
- 顯示這個app將會提供使用者什麼功能並且會需要使用哪些個人資料

3. app認證(app authentication)
- 使用者同意授與app存取資料的權限

什麼是access token?
access token是用來透過graph api向facebook下指令時所需的東西, 在app完成認證之後就能夠獲得.

server-side flow
1. 拿authorization code
REQUEST: https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=read_stream
REDIRECT TO: http://YOUR_URL?code=A_CODE_GENERATED_BY_SERVER

2. 拿access token
REQUEST: https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE
RESPONSE: access_token=YOUR_ACCESS_TOKEN&expires=EXPIRE_TIME


client-side flow
拿access token

REQUEST: https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=read_stream&response_type=token
REDIRECT TO: http://YOUR_URL#access_token=166942940015970%7C2.sa0&expires_in=64090


什麼情況下access token會無效?
1. token過期 (一般情況下使用期限是2小時)
- 使用者曾經同意app的存取權, 但超過當初授予此token所限訂的使用期限.
- 當app利用此token透過graph api下指令時, 會收到HTTP 400的回應並且得到以下錯誤訊息
{
error: {
type: "OAuthException",
message: "Session has expired at unix time
SOME_TIME. The current unix time is SOME_TIME.”
},
}


2. 使用者更改密碼
- 使用者曾經同意app的存取權, 但之後換了密碼
- 當app利用此token透過graph api下指令時, 會收到HTTP 400的回應並且得到以下錯誤訊息
{
error: {
type: "OAuthException",
message: "The session has been invalidated because
the user has changed the password.",
},
}


3. 使用者變更app的存取權限
- 使用者曾經同意app的存取權, 但後來進入app管理頁面取消權限(如下圖)

- 當app利用此token透過graph api下指令時, 會收到HTTP 400的回應並且得到以下錯誤訊息
{
error: {
type: "OAuthException",
message: "Error validating access token: USER_ID
has not authorized application APP_ID",
},
}


4. 使用者登出facebook
- 使用者曾經同意app的存取權(app並未取得offline_access的能力), 但之後使用者登出
- 當app利用此token透過graph api下指令時, 會收到HTTP 400的回應並且得到以下錯誤訊息
{
"error": {
"type":"OAuthException","message":"Error validating
access token: The session is invalid because the user logged out."
}
}


access token無效該如何處理?
首先要注意的就是在下每個graph api指令時都要檢查是否有錯誤發生. 確認是token失效的問題之後就要重新取得認證. (只是單純的過期, 則只需要再次登入, 若是使用者收回了app存取權, app就需要重新獲得授權)

參考資料
1. How-To: Handle expired access tokens
2. Authentication

No comments:

Post a Comment