2011-06-01 178 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();