我在我的iframe facebook应用程序中使用Facebook php-sdk来获取用户登录状态。 我使用Facebook帐户退出后立即>注销链接,会话尚未销毁。我必须在旧会话到期前等待几分钟,然后我的应用程序将再次获得正确的登录状态。
我希望Facebook能够在用户退出时杀死自己和会话。如何手动终止会话?
这是我的代码:
$initParams = array(
'appId' => $conf['app_id'],
'secret' => $conf['secret_api_key'],
'cookie' => TRUE,
);
$fb = new Facebook($initParams);
$fb->getSession(); // will return a session object eventhough user signed out!
解决:
如果用户先前已注销,则调用$fb->api('/me')
会破坏会话。
我已将代码更改为:
if ($session)
{
try
{
$fbuid = $fb->getUser();
$me = $fb->api('/me');
}
catch(FacebookApiException $e){}
}
如果API调用不成功,$session
将设置为NULL。非常奇怪的行为,我不解释这里发生的一切,但它解决了我的问题,即没有通过getSession()
方法更新剩余的会话对象。
答案 0 :(得分:7)
我正在使用$ fb-> getUser(),我所做的几乎与你的相同。
if ($fb->getUser())
{
try
{
$me = $fb->api('/me');
}
catch(FacebookApiException $e){
**$fb->destroySession();**
}
}
我发现仅使用API来检查FB是否已注销有时是不一致的,但是使用destroySession(),会话肯定会被破坏。
答案 1 :(得分:3)
如果您在登录页面上使用javascript FB.INIT调用,则将status设置为false。
有关status属性的详细信息: http://developers.facebook.com/docs/reference/javascript/FB.init/
答案 2 :(得分:1)
尝试在LoginWindow(AS3)的某处找到formatData函数并找到以下行:
vars.redirect_uri = FacebookURLDefaults.LOGIN_SUCCESS_URL
更改http://www.facebook.com/
的值并在登录时从该html页面注销。
如果您是开发人员而非最终用户,这是临时注销解决方案。
答案 3 :(得分:0)
Facebook应该将会话与会话所属的帐户取消关联。您可以使用Facebook :: getUser()来检查是否已完成:
if ($fb->getUser() === null) {
// User logged out
} else {
// User logged in
}
答案 4 :(得分:0)
尝试$facebook->setSession(null)
或使用javascript <a href="/logout/" onclick="FB.logout();">Logout</a>
答案 5 :(得分:0)
退出无法以任何方式运作。
登录Facebook后,尝试在浏览器中发布此链接。
https://www.facebook.com/logout.php
会发生什么?它带你到你的Facebook。根本没有注销。
你做什么,检查功能(取决于你的API)handleLogout并检查输出。就我而言,它返回整个facebook html页面。
答案 6 :(得分:0)
我设法解决此问题的唯一方法是使用签名请求清除会话以检查用户ID:
$facebook = Membership::getFacebookApp();
$signed_request = $facebook->getSignedRequest();
if(isset($_SESSION['facebook_id']) && $signed_request['user_id'] != (int)$_SESSION['facebook_id']){
$_SESSION = array();
}