2011-07-15 174 views
13

我正在從this reference開始工作,並嘗試實施OAuth協議以允許用戶通過Facebook登錄我的網站。但是,Facebook的文檔非常糟糕,並且在幾個關鍵部分都不清楚。如何續訂過期的Facebook訪問令牌?

它說,授權採取三個步驟:

  1. 用戶認證(用戶重定向到https://facebook.com/dialog/oauth?client_id=...&redirect_uri=...,並期望被稱爲回redirect_uri頁用code)。很棒!

  2. 應用程序授權(由Facebook等處理)。很棒!

  3. 應用認證(在回調頁面,搶code你並調用https://graph.facebook.com/oauth/access_token?client_id=...&redirect_uri=...&client_secret=...&code=...,響應的主體將包括access_token我們需要做的東西)

據我所知,與access_token ,我可以調用API等。但是,到期時會發生什麼?我可以得到一個新的,但是到了這個時候,以後會有很多的HTTP請求,而且我不再有我以前用它來獲得它的code。我是否需要將codeaccess_token一起存放?或者,我必須告訴用戶再次登錄,因此我得到一個新的code以獲得新的access_token

或者,我錯過了關鍵部分嗎?我不需要一個offline_access令牌,因爲我只會輪詢數據以響應用戶操作。

回答

25

access_token過期時,用戶將被視爲Facebook「註銷」。你的應用程序將經歷與第一次相同的過程,但用戶可能不會。

如果用戶沒有撤​​銷對您的應用程序的訪問權限,並且用戶在當時登錄Facebook,則應用程序授權過程將自行處理,而不需要用戶執行任何操作,您將收到新的access_token

如果用戶沒有撤​​銷對您的應用的訪問權限,但未登錄到Facebook,他們將在App Authorization步驟中顯示Facebook登錄。他們不會被要求再次給予您的應用權限,因爲Facebook知道您的應用ID是由該用戶授權的。

最後,如果用戶已經撤銷了訪問權限,那麼他們將獲得原始的App Authorization請求,並且您將遵循原始流程。

本質上講,你應該考慮access_token揮發性,而不用費心保存它,但使用access_token您作爲用戶登錄過程,這是發生在幕後所有的時間,並且只涉及用戶時的一部分他們退出Facebook或撤銷訪問您的應用程序。

這與Twitter的OAuth不同,您可以使用它存儲和重新使用它。

+0

所以,等等,你是說我應該在每一頁加載時重新進行身份驗證?這不會增加到我的服務器的請求數量嗎? –

+1

您只需在access_token過期時重新進行身份驗證。獲取access_token的響應還包括一個expires參數,該參數是access_token到期前的秒數。您知道何時發佈令牌,因此您只需根據秒數檢查它是否已過期。如果有,請換一個新的。如果沒有,那麼繼續使用它。 – Owen

+0

哦,好的。幸運的是,這是我之前得出的結論。當令牌過期時,我只需在OAuth過程的開始處插入重定向。 –

5

從你的問題聯繫Facebook的文檔:

一旦令牌過期,則需要重新運行上面 產生一個新的代碼和的access_token的步驟,如果用戶雖然已經 授權你的應用程序,他們不會被提示再次這樣做。

access_token到期時,您將需要通過回到相同的步驟來獲得一個新的。用戶將不得不再次登錄,並且必須獲得新的code,然後才能獲得新的access_token