Facebook PHP SDK getUser()方法甚至在从Facebook取消授权应用程序后返回uid

时间:2011-06-23 14:38:56

标签: php facebook facebook-php-sdk facebook-authentication

我正在编写一个使用facebook的PHP SDK的网络应用程序。我正在使用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();

我不明白为什么即使在我从facebook中的facbeook隐私设置中删除了应用程序之后,getUser()仍继续返回我的facebook uid。谁知道为什么?

5 个答案:

答案 0 :(得分:2)

这是因为用户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课程......等)。

答案 1 :(得分:1)

他们网站的实施与其API的开发不同步。这是两个独立的发展路线。因此,他们有相当多的开发人员在网站部分工作,以及从事SDK工作的人员,因此要么没有正确地向两个团队传达某些内容,要么不正确地实施其中一个团队定义的要求。或者只是改变了影响一个团队但不影响另一个团队的要求。

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

答案 2 :(得分:1)

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

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

为简单起见,您可以将其保留为公共功能。然后在catch语句中,您可以添加

$this->facebook->clearSessionData();

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

答案 3 :(得分:1)

你可以试试这个:

Umer Pasha撰写:

Facebook getUser() function returning user ID after logout

问题似乎是在第567行的basefacebook.php中的php-sdk

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

此方法返回sdk正在查找的cookie的名称。但是,javascript-sdk使用'fbsr_'前缀。将其更改为'fbs_',它可以正常工作。

答案 4 :(得分:0)

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

在PHP-SDK v3.2.2中有一个公共方法:destroySession()。这不会破坏你的$ _SESSION,只清除该类收集的所有缓存数据。它在base_facebook.php