2011-09-25 65 views
0

我正在使用Facebook Connect應用程序。想象一下,這是一種應用程序,用戶訪問我的網站,點擊連接按鈕,登錄Facebook並返回到我的網站,並等待其他用戶進行連接。會話清除問題與PHP

連接時使用的參數是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 cookies,我嘗試了以下靜態方法以測試它的工作原理。但是,即使這也失敗了。

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,它會非常巧妙地工作。

回答

0

由於跨域限制,您不能編輯來自不同域名(即Facebook cookie)的Cookie。你可以調用javascript sdk FB.logout()函數來正確註銷。在PHP SDK具有getLogoutUrl方法,你可以撥打:

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

如果用戶有「offline_access」這是目前不可能清除會話。

調用PHP SDK方法getLoginUrl()看起來好像應該可以工作,它會將用戶從Facebook上註銷,但是當返回到自己的站點時,會話仍然有效。

這不是它應該如何工作的錯誤只有在最新的PHP SDK v3中引入。

我已經註冊了一個bug,請投/添加您的攝製,以幫助它固定:

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