过去几周我一直在开发应用程序,直到现在还没有问题。就在几天前,一个奇怪的错误已经开始发生:
我的应用程序使用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."}}
答案 0 :(得分:1)
如果以这种方式出现“无效的OAuth访问令牌”错误,我通常会调用FB.logout(),然后立即在回调中调用FB.login()。
FB.logout(function(response) {
// user is now logged out
FB.login(...)
});
不理想,但是修复这种用例的最佳方法。