猿问

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

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

我正在尝试使用一个需要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,意味着$facebook->getUser()始终返回0,然后列出用户的面孔,包括已登录的用户,但如果我打电话$facebook->api('/me')或其他什么,那么它将会抛出无效的令牌异常。

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

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


蝴蝶刀刀
浏览 692回答 3
3回答

蓝山帝景

我有同样的问题,我想出来是因为SDK使用变量$_REQUEST,在我的环境中不是真的$_GET,$_POST与$_COOKIE变量合并。我认为这取决于PHP版本,这就是为什么有人通过启用cookie使其工作。我在base_facebook.php中找到了这段代码:protected&nbsp;function&nbsp;getCode()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isset($_REQUEST['code']))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($this->state&nbsp;!==&nbsp;null&nbsp;&& &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isset($_REQUEST['state'])&nbsp;&& &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->state&nbsp;===&nbsp;$_REQUEST['state'])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CSRF&nbsp;state&nbsp;has&nbsp;done&nbsp;its&nbsp;job,&nbsp;so&nbsp;clear&nbsp;it &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->state&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->clearPersistentData('state'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$_REQUEST['code']; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::errorLog('CSRF&nbsp;state&nbsp;token&nbsp;does&nbsp;not&nbsp;match&nbsp;one&nbsp;provided.'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;}我通过创建$ server_info变量来修改它,如下所示。protected&nbsp;function&nbsp;getCode()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;$server_info&nbsp;=&nbsp;array_merge($_GET,&nbsp;$_POST,&nbsp;$_COOKIE); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isset($server_info['code']))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($this->state&nbsp;!==&nbsp;null&nbsp;&& &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isset($server_info['state'])&nbsp;&& &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->state&nbsp;===&nbsp;$server_info['state'])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CSRF&nbsp;state&nbsp;has&nbsp;done&nbsp;its&nbsp;job,&nbsp;so&nbsp;clear&nbsp;it &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->state&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->clearPersistentData('state'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$server_info['code']; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::errorLog('CSRF&nbsp;state&nbsp;token&nbsp;does&nbsp;not&nbsp;match&nbsp;one&nbsp;provided.'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return
随时随地看视频慕课网APP
我要回答