2012-05-14 53 views
1

我的應用程序使用在客戶端的JavaScript的Facebook SDK授權和授權的用戶獲取應用程序的訪問令牌來自Facebook的API,使用Facebook的cookie簽名的請求,並提供code,並將其存儲到數據庫中。當我應該加載一個新的訪問令牌?

一切工作正常,但我不知道,當我要刷新存儲訪問令牌?如果用戶更改了密碼,並且已經登錄/重新連接,該怎麼辦?

據我瞭解,現在她有新的訪問令牌,並且應用應該從Facebook加載它。但是我怎麼能理解我什麼時候應該檢查新的令牌?使用facebook cookie檢查每個請求cookie不起作用,因爲每個用戶每秒的請求數很少(事件如果她沒有更改密碼)。或者,也許我做錯了什麼?

我的意思是:

  • 我已經授權的客戶端用戶
  • 我有餅乾與簽名的請求
  • 簽名的請求是相當足夠的授權服務器端用戶(驗證用戶憑據)
  • 我可以通過調用API的Facebook得到access token,隨時隨地當用戶用戶發出請求,我的應用程序(因爲我需要簽名的請求一個code)。所以,我這樣做,當我沒有存儲access token或現有access token已過期。
  • access token只是存儲在數據庫中,並且可以隨時使用,在不同的線程,也許幾分鐘後(意思是,我們沒有與簽名的請求用戶請求和餅乾)
  • 如果存儲access token沒有過期,但無效在臉上?我需要獲取新的access token,但此時cookie已經消失。

目前我看到的只有一條路:從簽名的請求商店code到DATABSE,當我們發現我們有無效access token,嘗試加載它。但我記下確定它是正確的方式,並沒有那麼多的可用於大多數情況下

回答

3

您有客戶令牌和服務器令牌,客戶端是短暫的(幾個小時)和服務器長期居住( 60天)。

在客戶端的令牌不應該打擾你太多,因爲你可以很容易地得到一個新的,因爲它在「Handling Invalid and Expired Access Tokens」指南指出:

桌面Web和移動Web應用程序,其實現認證使用JavaScript SDK

調用FB.getLoginStatus()或確保狀態:真正的設置,當你調用 FB.init()是指在你的 應用程序的用戶的土地和被簽署成爲Facebook而言,下一次authResponse對象您 由於這些調用將包含新的有效的 訪問令牌。

在這種情況下,它只需將用戶的行爲使用應用程序 其中隱含產生新的訪問令牌。

在服務器端的令牌,你在db堅持,不能因爲容易被複制,用戶被髮送到再次認證對話框:

桌面Web和移動其實現服務器端認證流程

爲了獲得在這種情況下,一個新的訪問令牌的Web應用程序,您必須通過全面的服務器端流再次通過用戶 :即獲得一個代碼和一個新的 交換它訪問令牌。

然而,假設用戶沒有取消授權的應用程序, 當你把用戶重定向到OAuth的對話框,用戶不會被 提示重新授權您的應用程序,並會立即 重定向到您的REDIRECT_URI。這意味着重新驗證 過程對用戶來說可能看起來是透明的。

你當然可以發送一個客戶端令牌給服務器並堅持這一點,但它是非常沒有意義的,因爲它是短暫的。 另一種選擇是在服務器端使用客戶端令牌的new endpoint to extend有效的然後堅持。

至於「如何知道什麼時候獲得一個新的令牌」,在服務器端,當您正在進行api請求時,只需檢查響應並查看是否返回了錯誤,如果是這樣的話(這裏有一個列表我添加的第一個網址)。 如果令牌已過期,只需再次將用戶發送到授權對話框(您可以將某種代碼返回到客戶端並從那裏執行),然後將新令牌保存到數據庫。

有沒有必要檢查cookie,這些都在後臺使用,但你不應該有任何關係。


編輯

不要使用餅乾,他們不應該在任何時候關注你。

你應該做的:

在服務器端,您應遵循Server-Side auth guide的說明,得到「代碼」,並與輔幣。 該令牌將有60天。

根據需要使用存儲在數據庫中的該令牌(其他線程,什麼不是),以及當您從Facebook獲取錯誤並說明令牌已過期時,只需將用戶導航回授權對話頁。

您不能使用「代碼」來獲取多個標記,這樣不會對您有所幫助。 如果用戶會話(和令牌)失效(出於各種原因),當您嘗試發出api請求時,您仍然會從Facebook返回錯誤,當發生這種情況時,只需再次將用戶發送到auth對話框。

+0

這是否意味着無法將客戶端Javascript身份驗證與服務器端身份驗證結合起來?我的意思是,它足夠服務器解析Facebook cookie來授權用戶在服務器端。但是這個cookie不包含訪問令牌,並且服務器不知道是currenlty存儲的訪問令牌是否仍然有效,或者不是。 –

+0

您沒有理由參與cookie,請讓SDK爲您做。隨着每個令牌的到期時間(應用令牌除外),你可以檢查該令牌是否仍然有效,如果有的話,它有多長時間。至於js/server auth,正如我寫的那樣,你可以發送一個客戶端令牌給服務器,但是這是毫無意義的,除非你擴展它。 –

+0

似乎我們正在談論不同的事情。我已更新了我的問題,請你看一下,好嗎? –

相關問題