我正在使用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,它的工作非常巧妙。
答案 0 :(得分:1)
如果用户有'offline_access',则目前无法清除会话。
调用PHP SDK方法getLoginUrl()看起来好像应该有效,它会将用户从Facebook中注销,但是当返回到您自己的站点时,会话仍然有效。
这不是它应该如何工作只在最新的PHP SDK v3中引入的bug。
我已经注册了一个错误,请投票/添加你的repro以帮助解决它:
答案 1 :(得分:0)
由于跨域限制,您无法编辑来自其他域(即Facebook Cookie)的Cookie。你可以调用javascript sdk FB.logout()函数来正确注销。 PHP SDK有一个可以调用的getLogoutUrl方法:
$facebook->getLogoutUrl( array(
'next' => 'http://example.com/logout.php')
);