使访问令牌无效?

时间:2012-05-22 14:29:00

标签: php jquery facebook facebook-graph-api sdk

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

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

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

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

我不想将用户从Facebook注销,因此FB.logout不可用。

这可能吗?

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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开关的工作方式类似于具有多个答案的单个if语句(大小写)。

我建议代码速度优化重新排序交换机,以便在交换机顶部列出最常见的错误,因为PHP交换机的工作方式是在列表中运行,直到找到与错误代码匹配的大小写。< / p>

答案 2 :(得分:1)

根据Facebook documentation,你不需要做任何复杂的事情。

在用户登录过程中,检索一个短期访问令牌并将其交换为长期访问令牌,该令牌有效期为60天。

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

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

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

答案 3 :(得分:0)

您无需使访问令牌无效。

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

有关详细信息,请查看facebook doc