3

是否可以使 facebook 访问令牌无效?

由于最近弃用了offline_access,我需要这样做。

问题是令牌不能延长超过 60 天。即使用户返回应用程序(除非我误解?)

所以,我想做的是使令牌无效,然后立即重新登录用户,以便我可以取回一个新的访问令牌,新的 60 天到期日。只要用户每两个月来一次,一切都应该没问题。

我不想让用户退出 Facebook,所以 FB.logout 不可用。

那可能吗?

4

4 回答 4

2

您可以发送一个 DELETE 请求/me/permissions,应该(我认为)使用户的会话无效。

但是,我真的不明白你为什么要这样做。无论您之前拥有什么令牌,您都可以只使用最终获得 60 天令牌的服务器端身份验证。因此,每次您想要多 60 天时,只需使用服务器端进程对用户进行身份验证。

于 2012-05-22T14:41:20.913 回答
2

我会认真考虑避免像瘟疫那样使用 Facebook Javascript SDK,因为它是异步的,这实际上意味着 Facebook 是安全的,但您的网站却不是。

我刚刚开始重建我的登录流程,我想知道我的这部分代码是否可以方便地管理用户令牌:

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    $fb_error = $e->getResult();
    error_log($e);
    $user = null;
  }
}


//https://developers.facebook.com/docs/reference/api/errors/
switch ($fb_error['error']['error_subcode']) {
    case '458':
    //Returned on app trying something or user attempting an action after app deauth
    //Can do database cleannup operations from this
        $fb_error = '458 - User removed the app from user settings';
        break;
    case '460':
    //App is no longer reauthorized and the user is trying something ?
    //Stop user from all activities if this comes up as they may deauth then try perform an action
        $fb_error = '460 - User needs to reauthorize';
        break;
    case '463':
    //Expired Token
    //This is where we autolog the user back in
        $fb_error = '463 - Token has expired and a new one needs to be requested';
        //need to somehow get the login request code from another page to hide it
        //or use htaccess tricks
        $facebook->getAccessToken();
        break;
    case '467':
    //Invalid Token
    //This is where we autolog the user back in
        $fb_error = '467 - Token is invalid and a new one needs to be requested';
        break;
}

您可以将错误输出到页面进行测试:

echo 'Error Subcode: '.$fb_error.'<br/>';
echo 'Facebook Error Dump:<br/>';
var_dump($e);

请注意,PHP switch 的工作方式类似于if具有多个答案(案例)的单个语句。

我建议代码速度优化重新排序开关以在开关顶部列出最常见的错误,因为 PHP 开关的工作方式是向下运行列表,直到找到与错误代码匹配的大小写。

于 2013-10-26T05:14:35.580 回答
1

根据 Facebook文档,您不需要做任何复杂的事情。

在用户登录过程中,取回一个短寿命的访问令牌,换成一个有效期为60天的长寿命访问令牌。

如果用户在一天中多次注销并登录,他将收到相同的访问令牌(可能),但到期时间不会更新。但至少经过一天后,您将收到一个具有新到期时间的新的长寿命访问令牌。

唯一可能的问题是用户持续登录超过两个月(超过 60 天)的情况。对于这种情况(即使这几乎不可能),我编写了一个小超时函数,当令牌过期时,它会在后台更新它。

我昨天下午重构了我的代码以检索和使用长期存在的令牌,所以没有足够的时间来确定,但根据提到的 Facebook 文档,它应该是这样的。

于 2013-07-10T09:13:31.007 回答
0

您不需要使访问令牌无效。

如果您使用的短期访问令牌进行交换,它将返回一个新的延长 60 天令牌。当用户再次使用该应用程序时,该特定的短期令牌始终会提供给您。使用客户端身份验证流程(JS SDK),这样您就可以确定您获得了短期令牌。使用新端点交换令牌。

有关更多信息,请查看facebook 文档

于 2012-05-22T14:48:06.607 回答