存储用户的 Facebook 访问令牌

Posted

技术标签:

【中文标题】存储用户的 Facebook 访问令牌【英文标题】:Storing a user's Facebook access token 【发布时间】:2011-09-06 10:38:57 【问题描述】:

我有一个存储用户访问令牌(以及其他一些数据)的数据库。当我授权用户时,我的权限列表包括 offline_access。

那么用户的访问令牌(客户端)总是是否与数据库中该用户的访问令牌相同?或者用户在注销、更改密码等时可以更改访问令牌吗?

【问题讨论】:

请问您是如何获得用户的访问令牌的? 【参考方案1】:

并非总是如此。

访问令牌通常会在某个时间点后过期。虽然有一种方法可以制作具有无限过期时间的访问令牌,但您需要请求 offline_access 作为权限之一。

查看here了解更多信息。

编辑刚刚看到您需要offline_access 作为权限。那么不,它们不会过期

【讨论】:

【参考方案2】:

不,即使使用offline_access,访问令牌也不总是相同的。当 1) 用户更改密码或 2) 停用您的应用时,您将需要获取新的访问令牌。否则,它应该保持不变。

但用户的 Facebook id 永远不会改变。这可以从访问令牌中解析出来,也可以通过调用 /me graph api 获得。

Facebook 有一个blog post 对此进行了详细说明。

更新:Facebook 专门为 handling revoked authorization 添加了一篇博文。

【讨论】:

在我的数据库中,我存储了与访问令牌相关的高分。由于该访问令牌可能过期并且与数据库的访问令牌不同,因此用户的高分将被“擦除”。您对如何解决这个问题有任何想法吗? 简单 - 只需将其与他们的 facebook 用户 ID 一起存储 - 这永远不会改变。 我完全忘记了用户有一个用户 ID。那么将用户的访问令牌存储在数据库中是否有任何意义? 如果您想调用 Facebook,则需要存储该令牌。但是,如果您实际上并不需要这些权限,则不应请求诸如 offline_access 之类的权限,因为这会增加用户拒绝您的申请的机会。 用户每次从不同设备登录时访问令牌都会更改,我是否正确?【参考方案3】:
 <?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://***.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();

【讨论】:

以上是关于存储用户的 Facebook 访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

官方 Facebook 应用程序是不是存储一些开放数据,例如访问令牌等

firebase auth是否可以存储和管理不同提供商的访问令牌?

使用 OWIN 在 ASP.NET MVC 5 应用程序中存储和检索 facebook 访问令牌

如何在社交身份验证中存储 facebook 的访问令牌

将访问令牌存储在用户的集合中更好还是分开?

Facebook - 永久用户访问令牌