2011-06-01 184 views
15

我有一個存儲用戶的訪問令牌(以及其他一些數據)的數據庫。當我授權用戶時,我的權限列表包括offline_access。存儲用戶的Facebook訪問令牌

那麼用戶的訪問令牌(客戶端)總是應該與數據庫中該用戶的訪問令牌相同嗎?或者用戶的訪問令牌在註銷時是否改變,更改密碼等?

+0

我可以知道你是如何讓用戶的訪問令牌? – 2012-08-29 10:30:34

回答

20

不,即使使用offline_access,訪問令牌也不總是相同的。在1)用戶更改其密碼或2)停用您的應用程序時,您需要獲取新的訪問令牌。否則,它應該保持不變。

用戶Facebook的ID將永遠不會改變。這可以從訪問令牌解析或通過調用/ me圖形api獲得。

Facebook有一個blog post,詳細介紹了這一點。

更新:Facebook專門爲handling revoked authorization添加了博文。

+0

在我的數據庫中,我存儲了與訪問令牌相關的高分。由於該訪問令牌可以過期並且不與數據庫的訪問令牌相同,所以用戶的高分將被「擦除」。你有什麼想法來解決這個問題嗎? – 2011-06-01 21:30:31

+3

簡單 - 只需存儲它與他們的Facebook用戶ID - 這將永遠不會改變。 – bkaid 2011-06-01 21:31:23

+0

我完全忘記了用戶有一個用戶ID。那麼將用戶的訪問令牌存儲在數據庫中會有什麼意義嗎? – 2011-06-01 21:40:59

1

並非總是如此。

訪問令牌通常會在某個時間點後過期。有一種方法可以使訪問令牌具有無限的過期時間,但您需要請求offline_access作爲其中一個權限。

查看here瞭解更多信息。

編輯剛纔看到您需要offline_access作爲權限。然後不,它們不會過期

1
<?php 
# We require the library 
require("facebook.php"); 
require("db.php"); 
# Creating the facebook object 
$facebook = new Facebook(array(
    'appId' => 'APP_ID', 
    'secret' => 'APP_SECRET_ID', 
    'cookie' => true 
)); 
# Let's see if we have an active session 
$session = $facebook->getSession(); 
if(!empty($session)) 
{ 
    try 
    { 
     $facebook_id = $session['uid']; 
     $facebook_access_token=$session['access_token']; 
     // Updating Facebook values into Users table 
     mysql_query("UPDATE users SET facebook_uid='$facebook_id', facebook_access_token='$facebook_access_token' WHERE username='$user_session'"); 
     header("Location: http://yourwebsite.com/home.php"); 
    } 
    catch (Exception $e){} 
} 
else 
{ 
    header("Location: http://yourwebsite.com/home.php"); 
} 
4

只想指出offline_access權限已被刪除。

https://developers.facebook.com/roadmap/offline-access-removal/

「雖然我們通過在開發應用程序遷移設置取出使用offline_access許可, ,我們現在允許 選項與長壽命到期時間使用access_tokens每次用戶修改您的應用時,都可以更新 (請參閱下面的例外 )。「

隨着更多的搜索,你會發現如何擴展訪問令牌。

How to extend access token validity since offline_access deprecation

這裏是https://stackoverflow.com/a/13224416/1753925工作示例:

$facebook->setExtendedAccessToken(); 
$access_token = $_SESSION["fb_".$fb_appId."_access_token"]; 
// now set it into the facebook object .... 
$facebook->setAccessToken($access_token); 
// now our fb object will use the new token as usual ... 
$accessToken = $facebook->getAccessToken();