Facebook API - 用户注销后会话仍然存在

时间:2010-12-22 16:59:22

标签: php session facebook-graph-api

我在我的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()方法更新剩余的会话对象。

7 个答案:

答案 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();
}