Facebook PHP SDK getUser()方法返回uid,即使在未授权来自Facebook的应用程序之后也是如


Facebook PHP SDK getUser() method returning uid even after unauthorizing application from facebook

我正在编写一个使用facebook的PHP SDK的web应用程序。我使用getUser()方法对用户进行身份验证,类似于以下内容:

    $user = $this->facebook->getUser();
    $loginUrl = $this->facebook->getLoginUrl(array(
        'scope' => 'email,publish_stream',
        'redirect_uri' => base_url() . 'index.php/welcome/create'
    ));;
    if(!$user){
        /*
         * User not authenticated, present with facebook authorize dialog
         * */
        echo "<script type='text/javascript'>window.location = '$loginUrl';</script>";
        die();

我不明白的是,为什么getUser()在我从脸书的facbeook隐私设置中删除了该应用程序后,仍然会继续返回我的脸书uid。有人知道为什么吗?

这是因为用户id仍在会话中!

这主要是在使用me对象进行调用时导致错误(需要活动访问令牌或类似的东西)。

克服这种情况的一种方法是:

try {
    $user_profile = $this->facebook->api('/me');
} catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
    if(DESIRED_ERR_NUM && session_id()) {
        session_destroy(); // OR UNSET FB RELATED VARS ONLY
    }
    echo '<script>top.location.href = "' .  $this->facebook->getLoginUrl(array("scope"=>"publish_stream,user_about_me","redirect_uri"=>"YOUR_URL_HERE")) . '"</script>';
    exit;
}

这是NOT一个工作代码,你需要检查错误号,如果你有一个会话,然后销毁它,或者只在其中取消设置Facebook相关的变量。

您可以通过执行来检查这是否属实

if(session_id()) {
    session_destroy();
}

(请注意,这将摧毁会话中的一切,不仅仅是与Facebook相关的东西!)

正如我所说,这不是一个工作代码,但希望它能让你开始(这肯定可以得到增强,推送到Facebook类等)。

他们网站的实现与API的开发不同步。这是两条独立的发展路线。因此,他们有相当多的开发人员在网站部分工作,也有人在SDK上工作,所以要么是一些事情没有正确地传达给两个团队,要么是其中一个团队对定义的需求的实现不正确。或者仅仅是需求的变化影响了一个团队,而没有影响到另一个团队。

这也令人不安,因为这可能是通过API访问私人数据的一种手段,而用户可能已通过网站禁止访问这些数据。

不幸的是,ifour的解决方案对我不起作用。我在NativeFacebook类中添加了一个额外的函数:

public function clearSessionData() {
    $this->setAccessToken(null);
    $this->user = 0;
    $this->clearAllPersistentData();
}

为了简单起见,您可以将其保留为一个公共函数。然后在您的catch语句中,您可以添加

$this->facebook->clearSessionData();

以确保删除以前连接的Facebook帐户数据的所有痕迹。

你可以试试这个:

作者:Umer Pasha:

Facebook getUser()函数在退出后返回用户ID

问题似乎出现在basefacebook.php的php-sdk中,位于的第567行

     protected function getSignedRequestCookieName() {
     return 'fbsr'.$this->getAppId();}

此方法返回sdk正在查找的cookie的名称。但是,javascript sdk使用"fbsr_"前缀。将其更改为"fbs_",效果良好。

旧线程,但仍有人可能会检查它。

在PHP-SDK第3.2.2版中,有一个公共方法:destroySession()。这不会破坏您的$_SESSION,只需清除类收集的所有缓存数据即可。它在base_facebook.php 中