没有Facebook用户ID返回。为什么?

时间:2013-09-11 16:09:22

标签: php facebook kohana kohana-3

我是Facebook SDK for PHP的新手。我在这里有一个非常基本的问题(this answer was not helpful):我目前登录了我的Facebook个人资料,但getUser()没有返回任何内容。为什么呢?

require_once("vendor/facebook-php-sdk/src/facebook.php");

class Controller_Test extends Controller {
    public function action_me()
        {
            $config = array();
            $config['appId'] = 'dfjq454...';
            $config['secret'] = 'adfw424...';
            $config['fileUpload'] = false;
            $facebook = new Facebook($config);  
            $user = $facebook->getUser();

            // Returns '0'
            echo "Me: ".$user;
            // ...

编辑1:

我尝试在bootstrap.php中取消注释这一行,但它不起作用'auth' => MODPATH.'auth', // Basic authentication

编辑2: 当我运行以下代码时

$user_profile = $facebook->api('/me');
        echo "My Profile: ".$user_profile;

我收到此错误

  

必须使用活动访问令牌来查询有关的信息   当前用户。

编辑3

FacebookApiException [ 0 ]: An active access token must be used to query information about the current user.
DOCROOT\vendor\facebook-php-sdk\src\base_facebook.php [ 1272 ]
1267    *
1268    * @param $result array A record storing the error message returned
1269    *                      by a failed API call.
1270    */
1271   protected function throwAPIException($result) {
1272     $e = new FacebookApiException($result);
1273     switch ($e->getType()) {
1274       // OAuth 2.0 Draft 00 style
1275       case 'OAuthException':
1276         // OAuth 2.0 Draft 10 style
1277       case 'invalid_token':
DOCROOT\vendor\facebook-php-sdk\src\base_facebook.php [ 881 ] » BaseFacebook->throwAPIException(arguments)
{PHP internal call} » BaseFacebook->_graph(arguments)
DOCROOT\vendor\facebook-php-sdk\src\base_facebook.php [ 654 ] » call_user_func_array(arguments)
APPPATH\classes\Controller\test.php [ 17 ] » BaseFacebook->api(arguments)
SYSPATH\classes\Kohana\Controller.php [ 84 ] » Controller_Test->action_me()
{PHP internal call} » Kohana_Controller->execute()
SYSPATH\classes\Kohana\Request\Client\Internal.php [ 97 ] » ReflectionMethod->invoke(arguments)
SYSPATH\classes\Kohana\Request\Client.php [ 114 ] » Kohana_Request_Client_Internal->execute_request(arguments)
SYSPATH\classes\Kohana\Request.php [ 986 ] » Kohana_Request_Client->execute(arguments)
DOCROOT\index.php [ 118 ] » Kohana_Request->execute()

2 个答案:

答案 0 :(得分:2)

来自Facebook Developer documentation

  

注意:配置为Native / Desktop应用程序的应用程序将无法进行需要应用程序access_token的API调用。

转到设置→高级,然后将其更改为Web

这是导致此问题的最常见原因,将其更改为Web应解决此问题。


如果情况并非如此,则可能是PHP SDK的一个问题,它依赖于服务器中的$_REQUEST超全局数组,由于默认情况php.ini,它已在PHP 5.4.x中发生了变化设置已更改。解决方案 source 是模仿$_REQUEST中使用base_facebook.php$_GET$_POST超级$_COOKIE的{​​{1}} - 全球数组。

base_facebook.php中找到以下代码:

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

?>

将其更改为:

<?php

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

?>

<强> See the difference.

答案 1 :(得分:0)

我遇到了类似的问题,这是可以帮助你的解决方案。

 $facebook = new Facebook(array(
    'appId'  => 'xxxx',
    'secret' => 'xxxxx',
    "redirect_uri" => "set the uri to point to the same page"
 ));

$user = $facebook->getUser();

if($user)
{
//your task
} else {
header('location:'. $facebook->getLoginUrl());

}

$user = $facebook->getUser();

if($user)
{
 //your task
} else {
header('location:'. $facebook->getLoginUrl());

}