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

Facebook PHP SDK getuser(注销是另一个选项卡问题),php,facebook,facebook-php-sdk,Php,Facebook,Facebook Php Sdk,作为一个简单的例子,我有两个文件。一个是index.php文件,一个是logout.php文件 我的index.php文件包含如下内容(我已删除了不必要的代码行。假设用户已对我的应用程序进行了身份验证): 所以,如果我登录facebook并加载此页面,它基本上会打印用户facebook id。到目前为止运行良好 要注销,假设我使用logout.php,它包含如下内容: require_once "class/facebook/config.php"; try{ include_once

作为一个简单的例子,我有两个文件。一个是index.php文件,一个是logout.php文件

我的index.php文件包含如下内容(我已删除了不必要的代码行。假设用户已对我的应用程序进行了身份验证):

所以,如果我登录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

当用户从Facebook注销时,用户不会从您的应用程序注销。Facebook和您的应用程序都不共享公共会话。但是当从应用程序注销被触发时,它也会从Facebook注销用户。

当用户从Facebook注销时,用户不会从应用程序注销。Facebook和您的应用程序都不共享公共会话。但是,当从应用程序注销被触发时,它也会从Facebook注销用户。

好的,没有简单的方法,但我已经用一种黑客方法解决了这个问题,即使用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

       }
    }
}
FB.api('/me',函数(响应){
if(response.id){
如果(response.id==){
//继续做你必须做的事
}否则{
//用户已更改或用户已从facebook单独注销
警惕(“我们再也不认识你了!”);
//继续注销或启动重新登录选项的代码
}
}
}

好的,没有简单的方法解决这个问题,但我已经用一种黑客的方式解决了这个问题,即使用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

       }
    }
}
FB.api('/me',函数(响应){
if(response.id){
如果(response.id==){
//继续做你必须做的事
}否则{
//用户已更改或用户已从facebook单独注销
警惕(“我们再也不认识你了!”);
//继续注销或启动重新登录选项的代码
}
}
}

因此产生了一个很大的问题。如果第一个用户注销facebook并忘记注销应用程序,另一个用户如果登录facebook并使用此应用程序,则可以访问第一个用户的数据和权限,这是一个潜在的安全问题。我将对此进行更深入的研究,并用我的findingsNope更新您,我尝试d很多事情,但是发现用户是否仍然登录Facebook是很困难的。所有事件等都与他在你的应用程序上的状态相对应。嘿,我已经发布了一个使用Javascript SDK的解决方案。显然,没有只使用PHP的解决方案:(因此产生了一个很大的问题。如果第一个用户注销facebook并忘记注销应用程序,另一个用户如果登录facebook并使用此应用程序,则可以访问第一个用户的数据和权限,这是一个潜在的安全问题。我将对此进行更深入的研究,并用我的findingsNope更新您,我尝试了一个lo很多事情,但是发现用户是否仍然登录Facebook是很困难的。所有事件等都与他在你的应用程序上的状态相对应。嘿,我已经发布了一个使用Javascript SDK的解决方案。显然,没有只使用PHP的解决方案:(