我正在为移动设备创建一个Facebook应用程序。此类应用程序显示在移动浏览器中,而不像在iframe中保存的Facebook画布页面。
我正在使用JS和PHP SDK的混合来授权和验证用户。用户需要已登录Facebook才能使用我的应用程序。如果没有,他们需要使用Facebook登录按钮登录。作为JS和PHP SDK之间的桥梁,我正在使用FacebookJavaScriptLoginHelper。
我的Facebook.php库的一部分正在完成这项工作:
<?php
// Initialize the SDK
FacebookSession::setDefaultApplication($this->app_id, $this->app_secret);
// Create the login helper
$this->helper = new FacebookJavaScriptLoginHelper();
try {
$this->session = $this->helper->getSession();
} catch(FacebookRequestException $ex) {
// When Facebook returns an error
} catch(Exception $ex) {
// When validation fails or other local issues
}
if ($this->session) {
// User logged in
$this->session = new FacebookSession($this->session->getToken());
}
?>
Facebook JS init:
<script type="text/javascript">
window.fbAsyncInit = function() {
FB.init({
appId: '{my app id}',
status: true,
xfbml: true,
cookie: true
});
}
FB.getLoginStatus(function(response) {
console.dir(response);
});
</script>
上面的代码工作正常,但是当它失败时有一个特定的情况。假设我在浏览器中打开了两个选项卡:在第一个选项卡中我打开了我的应用程序,在第二个选项卡中 - 我已登录Facebook。可以采用两种方案:
我退出Facebook 并使用我的应用刷新标签页。结果是正确的:
FacebookSession
是NULL
response.status
的FB.getLoginStatus
为'unknown'
。用户不是
登录。我转到第二个标签,重新登录Facebook 并使用我的应用刷新第一个标签。结果不正确,但仅限于第一次刷新:
FacebookSession
仍为NULL
,即使response.status
的{li> FB.getLoginStatus
为'connected'
第一次刷新失败的原因似乎是显而易见的:在重新加载页面的那一刻,PHP SDK在Facebook cookie刷新之前被触发。但是,当用户注销时,它永远不会成为问题 - 在这种情况下,不知怎的FacebookSession
会立即更新,如预期的那样。
当用户登录Facebook时,它怎么会不一样?
答案 0 :(得分:2)
这有帮助吗?
对FB.getLoginStatus的后续调用将从此缓存的响应中返回数据。这可能会导致用户自上次完整会话查询以来登录(或退出)Facebook的问题,或者用户已在其帐户设置中删除了您的应用程序。
要解决此问题,请调用FB.getLoginStatus,并将第二个参数设置为true以强制向Facebook进行往返 - 有效刷新响应对象的缓存。
FB.getLoginStatus(function(response) {
// this will be called when the roundtrip to Facebook has completed
}, true);
来源:https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus
部分:到Facebook服务器的往返