authorization - FB.login 返回无效的 OAuth 访问 token

标签 authorization facebook-javascript-sdk facebook-php-sdk facebook-login facebook-access-token

过去几周我一直在开发一个应用程序,直到现在还没有出现任何问题。就在几天前,一个奇怪的错误开始出现:

我的应用程序使用 PHP SDK 并实现用于用户授权的 Javascript SDK。允许用户自由漫游应用程序,但是当他们单击视频时,会调用 FB.login 向用户请求权限并获取访问 token 。

jQuery 代码

FB.login(function(response) {

    if (response.authResponse) {

        //Set global vars
        fb_uid = response.authResponse.userID;
        fb_token = response.authResponse.accessToken;

        //If user has already authorized the app
        if (response.status === 'connected') {

            //Create the user record
            $.ajax(site_url + '/facebook/create_fb_user', {
                type: 'POST',
                dataType: 'json',
                data: {fb_uid: fb_uid, token: fb_token},
                success: function (data) {
                    user = data.resp.fb_user;
                    viewVideo(item);
                }
            });
        };
    };
}, {scope: "publish_stream"});

PHP代码
try {

    $this->_fb->setAccessToken($this->request->post('token'));

    $data = $this->_fb->api("/me");

    $model = new Model_Fbuser;
    $model->data = array(
        'fb_uid' => $data['id'],
        'fb_token' => $extended_token
    );
    $resp = $model->update();

    return $this->render_json(array(
        'success' => TRUE,
        'resp' => $resp
    ));

} catch (Exception $e) {

    return $this->render_json(array(
        'success' => FALSE,
        'error' => $e->getMessage(),
        'token' => $this->request->post('token')
    ));

}

用户第一次这样做时,FB.login 调用会返回一个有效的访问 token ,PHP SDK 能够设置 token ,一切都按预期进行。

但是,如果用户在其应用程序设置中撤销应用程序的访问权限,然后返回到应用程序,他们将再次看到 FB.login,但是这一次,该调用返回了他们之前获得的相同访问 token ,它具有已经被撤销了访问权限。尝试使用 PHP SDK 设置访问 token 会引发异常:“无效的 OAuth 访问 token ”。

然而,如果我然后在 Facebook 调试器中检查 token ,则表示它是有效的。

编辑:
进一步调查显示,用户每次在同一 session 中都发出相同的访问 token 。如果用户注销,然后重新登录,他们将收到一个新的有效 token 。但是,如果他们在没有先注销的情况下尝试获取新 token ,Facebook 就会向他们重新发放相同的无效 token 。尝试使用此访问 token 查询有关用户的信息时,响应如下:
{"error":{"type":"OAuthException","message":"Error validating access token: The session was invalidated explicitly using an API call."}}

最佳答案

如果通过这种方式得到“无效的 OAuth 访问 token ”错误,我通常调用 FB.logout(),然后在回调中立即调用 FB.login()。

FB.logout(function(response) {
  // user is now logged out
  FB.login(...)
});

不理想,但解决此类用例的最佳方法。

关于authorization - FB.login 返回无效的 OAuth 访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13884179/

相关文章:

Facebook - 超过 2 个月的应用 token 到期日

mysql - 如果publish_stream成功,只想添加到mysql数据库

php - 如何通过api将多张图片上传到Facebook的一篇帖子

java - 用户授权 Java SE

angularjs - Node.js 和 AngularJS 实现身份验证和授权机制的最快、最简单的方法

c# - 如何获取使用 System.Diagnostics.Process.GetProcess(string) 的权限?

ASP.NET web.config 授权设置在子文件夹中被忽略

css - 为移动设备调整 Facebook 插件(例如在 Facebook 上找到我们、点赞按钮、发送按钮)

javascript - FB.login 有效但弹出窗口未关闭

javascript - Facebook 帖子嵌入呈现但未显示