PHP的会话清除问题

时间:2011-09-25 12:50:13

标签: facebook session cookies

我正在使用Facebook Connect应用程序。想象一下,这是一种应用程序,用户来到我的网站,点击连接按钮,登录到Facebook并返回我的网站并等待另一个用户连接。

我在连接时使用offline_access参数。一旦用户回到我的网站, 我需要清除所有会话cookie。如果会话未成功清除,并且下一个用户进入并连接,则用户将无法获取登录页面,而是在完成上次会话状态后立即重定向到我的响应URL。

我一起尝试了这些方法来清除会话:

    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
                  $params["path"], $params["domain"],
                  $params["secure"], $params["httponly"]);
    }
    if (isset($_SERVER['HTTP_COOKIE'])) {
        $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
        foreach($cookies as $cookie) {
            $parts = explode('=', $cookie);
            $name = trim($parts[0]);
            setcookie($name, '', time()-42000);
            setcookie($name, '', time()-42000, '/');
        }
    }

使用上述方法,有些工作正常,但并非所有会话都被清除,尤其是Facebook域特定的cookie。因此,为了删除Facebook cookie,我尝试了以下静态方法来测试它是如何工作的。但是,即使这样也失败了。

    setcookie('L', '', time()-42000,"/",".facebook.com");
    setcookie('act', '', time()-42000,"/",".facebook.com");
    setcookie('c_user', '', time()-42000,"/",".facebook.com");
    setcookie('datr', '', time()-42000,"/",".facebook.com");
    setcookie('locale', '', time()-42000,"/",".facebook.com");
    setcookie('lu', '', time()-42000,"/",".facebook.com");
    setcookie('pk', '', time()-42000,"/",".facebook.com");
    setcookie('p', '', time()-42000,"/",".facebook.com");
    setcookie('presence', '', time()-42000,"/",".facebook.com");
    setcookie('s', '', time()-42000,"/",".facebook.com");
    setcookie('sct', '', time()-42000,"/",".facebook.com");
    setcookie('x-src', '', time()-42000,"/",".facebook.com");
    setcookie('xs', '', time()-42000,"/",".facebook.com");

最后,我尝试了常规方法,

    unset($_SESSION['fb_243155855719532_access_token']);
    unset($_SESSION['fb_243155855719532_code']);
    unset($_SESSION['fb_243155855719532_user_id']);
    unset($_SESSION['fb_243155855719532_state']);

    // Finally, destroy the session.
    session_unset();
    session_destroy();exit;

销毁会话有效,但Facebook会话仍未清除。如果我尝试使用Firefox Web Dev插件清除会话cookie,它的工作非常巧妙。

2 个答案:

答案 0 :(得分:1)

如果用户有'offline_access',则目前无法清除会话。

调用PHP SDK方法getLoginUrl()看起来好像应该有效,它会将用户从Facebook中注销,但是当返回到您自己的站点时,会话仍然有效。

这不是它应该如何工作只在最新的PHP SDK v3中引入的bug。

我已经注册了一个错误,请投票/添加你的repro以帮助解决它:

http://developers.facebook.com/bugs/250825644953332

答案 1 :(得分:0)

由于跨域限制,您无法编辑来自其他域(即Facebook Cookie)的Cookie。你可以调用javascript sdk FB.logout()函数来正确注销。 PHP SDK有一个可以调用的getLogoutUrl方法:

$facebook->getLogoutUrl( array(
    'next'  => 'http://example.com/logout.php')
);