我有一个网站,我正在尝试实施Facebook登录。用户将使用Facebook凭据登录,并将能够发布到他们的Facebook时间表。登录过程将通过Javascript SDK进行,但是发布/发布到他们的时间线将通过PHP SDK进行,因为在服务器端也会发生一些额外的数据库事件。
Javascript登录工作正常,但是当我对服务器进行多次Ajax调用时,单次使用访问令牌会导致问题。我在服务器端收到“此授权代码已被使用。”错误。我按照说明使用Facebook开发人员页面https://developers.facebook.com/docs/facebook-login/access-tokens/expiration-and-extension创建了一个长期存在的令牌,并确认每个客户都收到了自己的令牌等。
我在服务器上使用getJavaScriptHelper()来确定用户是否已登录(仍然登录),然后再执行任何进一步的处理,但无法确定 如何更新短期访问令牌具有长期存在的客户 。我可以使用服务器端长期令牌将其放入我见过建议的会话中,但除非我遗漏了某些内容,否则我仍然需要弄清楚用户是否仍然登录,管理会话变量,存储和更新该令牌,并在用户注销时删除会话,我认为Facebook SDK会为我做。
其他信息或问题说明。
我可以使用JS SDK,但它可能会使我的代码更复杂,无论如何我只是想按照我认为有意义但现在似乎不完整的Facebook文档,或者我错过了一些东西。
以下是我认为是代码的关键部分,现在忘记了长期存在的令牌: -
Javascript登录代码几乎直接来自Facebook文档。
window.fbAsyncInit = function() {
FB.init({
appId : app_id,
cookie : true,
xfbml : true,
version : 'v2.8'
});
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
console.log('Logged in.');
} else {
FB.login();
}
});
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
PHP部分以及我为什么要尝试获取长期访问令牌的原因。登录后,第一个Ajax调用可以正常通过下面的代码,并允许我将一些文本发布到Facebook用户的时间轴。除非我手动重新加载浏览器页面,否则第二次Ajax调用在getAccessToken()失败时使用“此授权代码已被使用”。 如何解决这个问题或我做错了什么?
$fb = new Facebook\Facebook([
'app_id' => $app_id,
'app_secret' => $app_secret,
'default_graph_version' => 'v2.8',
]);
$helper = $fb->getJavaScriptHelper();
try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
error_log ( 'getAccessToken() - Graph returned an error: ' . $e->getMessage() );
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
error_log ( 'getAccessToken() - Facebook SDK returned an error: ' . $e->getMessage() );
exit;
}
// Further code to publish to users timeline…