Facebook PHP SDK getuser(注销是另一个选项卡问题)


Facebook PHP SDK getuser (logout is another tab issue)

作为一个简单的例子,我有两个文件。一个是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注销了用户。