过去几周我一直在开发一个应用程序,直到现在还没有出现任何问题。就在几天前,一个奇怪的错误开始出现:
我的应用程序使用 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/