为什么 Facebook PHP SDK getUser 总是返回 0?

2022-08-30 12:28:51

我正在尝试与一个需要Facebook用户提供一些信息的网站合作,我正在使用PHP和JS SDK。

我在PHP中有一个函数:

public function isLoggedOnFacebook() {
    $user = $this->_facebook->getUser();
    if ($user) {
        return $this->_facebook->api("/$user");
    }
    return false;
}

在 保存 SDK 中的 facebook 对象的类上。$this->_facebook

然后在一个块上,我这样做:

<?php if (!$this->isLoggedOnFacebook()): ?>
<div>
   <fb:login-button show-faces="true" perms="email" width="500" />
</div>
<?php endif ?>

FB JS环境设置正确(我认为)因此可以正常工作。因此,用户获取弹出窗口并授权该网站。

问题是,即使在用户授权应用程序后,$user始终为0,这意味着始终返回0,然后列出用户的面孔,包括登录的用户,但是如果我让它调用或其他,那么它将引发无效令牌异常。$facebook->getUser()$facebook->api('/me')

我已经看到了这个问题,但我还没有看到解决方案,我不知道问题出在哪里,我的想法也用完了。

在开发人员的Facebook页面上的应用程序部分有一个“网站”选项卡,您可以在其中设置站点URL和站点域,我认为这是导致我问题的原因,但我不知道这些字段应该包含什么。


答案 1

我遇到了同样的问题,我发现这是因为SDK使用变量,而在我的环境中,它与和变量合并是不正确的。$_REQUEST$_GET$_POST$_COOKIE

我认为这取决于PHP版本,这就是为什么有人通过启用cookie使它工作的原因。

我在base_facebook.php中找到了这个代码:

protected function getCode() {
    if (isset($_REQUEST['code'])) {
        if ($this->state !== null &&
                isset($_REQUEST['state']) &&
                $this->state === $_REQUEST['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $_REQUEST['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}

我通过创建$server_info变量在下面看到的那样对其进行了修改。

protected function getCode() {
    $server_info = array_merge($_GET, $_POST, $_COOKIE);

    if (isset($server_info['code'])) {
        if ($this->state !== null &&
                isset($server_info['state']) &&
                $this->state === $server_info['state']) {

            // CSRF state has done its job, so clear it
            $this->state = null;
            $this->clearPersistentData('state');
            return $server_info['code'];
        } else {
            self::errorLog('CSRF state token does not match one provided.');
            return false;
        }
    }

    return false;
}

答案 2

我遇到了类似的问题。$facebook->getUser() 返回 0,有时当用户实际上没有登录时,它返回了有效的用户 ID,导致当我尝试进行图形 API 调用时出现致命的 Oauth 错误。我终于解决了这个问题。我不知道这是否是正确的方式,但它有效。代码如下:

<?php
include 'includes/php/facebook.php';
$app_id = "APP_ID";
$app_secret = "SECRET_KEY";
$facebook = new Facebook(array(
    'appId' => $app_id,
    'secret' => $app_secret,
    'cookie' => true
));

$user = $facebook->getUser();

if ($user <> '0' && $user <> '') { /*if valid user id i.e. neither 0 nor blank nor null*/
try {
// Proceed knowing you have a logged in user who's authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) { /*sometimes it shows user id even if user in not logged in and it results in Oauth exception. In this case we will set it back to 0.*/
error_log($e);
$user = '0';
}
}
if ($user <> '0' && $user <> '') { /*So now we will have a valid user id with a valid oauth access token and so the code will work fine.*/
echo "UserId : " . $user;

$params = array( 'next' => 'http://www.anujkumar.com' );
echo "<p><a href='". $facebook->getLogoutUrl($params) . "'>Logout</a>";

$user_profile = $facebook->api('/me');
echo "<p>Name : " . $user_profile['name'];
echo "<p>";
print_r($user_profile);

} else {/*If user id isn't present just redirect it to login url*/
header("Location:{$facebook->getLoginUrl(array('req_perms' => 'email,offline_access'))}");
}

?>

推荐