【问题标题】:Session clearing issue with PHPPHP的会话清除问题
【发布时间】:2011-11-24 15:01:26
【问题描述】:

我正在使用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,它会非常智能地工作。

【问题讨论】:

    标签: facebook session cookies


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果用户有“offline_access”,则当前无法清除会话。

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

      这不是它应该如何工作的错误,仅在最新的 PHP SDK v3 中引入。

      我已经注册了一个错误,请投票/添加您的复制品以帮助修复它:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-15
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多