FB.login返回无效的OAuth访问令牌

时间:2012-12-14 18:17:28

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

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

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

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调用返回一个有效的访问令牌,PHP SDK可以设置令牌,一切都按预期工作。

但是,如果用户在其“应用程序设置”中撤消应用程序的访问权限,然后返回到应用程序,则会再次向他们显示FB.login,但这次,该调用将返回之前给出的相同访问令牌,已取消其访问权限。尝试使用PHP SDK设置访问令牌会引发异常:“无效的OAuth访问令牌。”

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

修改 进一步调查显示,用户每次在同一会话中发出相同的访问令牌。如果用户注销,则重新登录,然后他们将收到新的有效令牌。但如果他们试图获得一个新的令牌而不先退出,Facebook会重新发布它们同样无效的令牌。尝试使用此访问令牌查询有关用户的信息时,这是响应:

{"error":{"type":"OAuthException","message":"Error validating access token: The session was invalidated explicitly using an API call."}}

1 个答案:

答案 0 :(得分:1)

如果以这种方式出现“无效的OAuth访问令牌”错误,我通常会调用FB.logout(),然后立即在回调中调用FB.login()。

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

不理想,但是修复这种用例的最佳方法。