2

我正在编写一个使用 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();

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

4

5 回答 5

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;
}

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

您可以通过执行以下命令来检查这是否为真:

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

(请注意,这将破坏会话中的所有内容,而不仅仅是与 Facebook 相关的内容!)

正如我所说,这不是一个有效的代码,但希望它能让你开始(这绝对可以增强,推送到 Facebook 类..等)。

于 2011-06-23T18:13:35.730 回答
1

你可以试试这个:

作者:乌默尔帕夏:

Facebook getUser() 函数在注销后返回用户 ID

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

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

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

于 2012-02-22T22:44:17.310 回答
1

他们网站的实现与 API 的开发不同步。这是两条不同的发展路线。所以他们有相当多的开发人员在网站部分工作,还有人在开发 SDK,所以要么没有正确地与两个团队沟通,要么不正确地执行其中一个团队定义的需求。或者只是影响一个团队但不影响另一个团队的需求变化。

这也令人不安,因为这可能是一种通过 API 访问私有数据的方法,而用户可能通过网站禁止了这种方法。

于 2011-06-23T15:00:08.180 回答
1

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

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

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

$this->facebook->clearSessionData();

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

于 2012-01-13T21:48:17.427 回答
0

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

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

于 2013-04-05T22:16:19.633 回答