作为一个简单的例子,我有两个文件。一个是index.php文件,一个是logout.php文件。
我的index.php文件包含如下内容(我已经删除了不必要的代码行)。让我们假设用户已经验证了我的应用程序):
require_once "class/facebook/config.php";
try{
include_once "facebook.php";
}catch(Exception $e){
error_log($e);
}
// Create our application instance
$facebook = new Facebook(array(
'appId' => APP_ID,
'secret' => APP_SECRET,
'cookie' => true,
'domain' => REDIRECT_URI,
));
// Get User ID
$user = $facebook->getUser();
print_r($user);
如果我登录到facebook并加载这个页面,它基本上打印用户的facebook id。到目前为止一切正常
退出使用logout。php其中包含如下内容
require_once "class/facebook/config.php";
try{
include_once "class/facebook/facebook.php";
}catch(Exception $e){
error_log($e);
}
$facebook = new Facebook(array('appId' => APP_ID, 'secret' => APP_SECRET, 'cookie' => true));
$facebook->destroySession();
header('location:'.REDIRECT_URI);
当我加载这个页面时,我退出了facebook和我的应用程序,并被重定向到我的索引页。到目前为止进展顺利!现在,由于index.php加载,我退出了登录,打印了0。这个看起来也不错。
让我们稍微改变一下场景。假设我们登录到facebook,加载index。php。工作正常返回用户id。很好。现在我们打开另一个标签,进入facebook.com。然后我们直接从facebook.com注销。
现在,当我们在上一个选项卡中刷新index.php时,当用户实际上已经注销facebook时,它仍然显示旧用户id !
好吧,没有简单的方法来解决这个问题,但我已经用一种黑客的方式解决了这个问题,即使用javascript sdk来检查这是否是同一个用户。我是这样做的。
FB.api('/me', function(response) {
if (response.id){
if (response.id == <?php echo $_SESSION['userid'];?>){
// proceed with whatever you have to do
}else{
// user has changed or user has logged out separately from facebook
alert("We don't know you anymore!");
// code to proceed to logout or fire re-login option
}
}
}
当用户从Facebook注销时,用户没有注销您的应用程序。Facebook和您的应用程序都不共享公共会话。但是,当您的应用程序的注销被触发时,它也从Facebook注销了用户。