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

时间:2011-07-22 12:50:56

标签: php facebook facebook-graph-api

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

我在PHP中有一个函数:

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

$this->_facebook中从SDK中保存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和站点域名,我认为这是我的问题的原因,但我不知道确切地说这些字段应该包含什么。

26 个答案:

答案 0 :(得分:23)

我遇到了同样的问题,我发现这是因为SDK使用变量$_REQUEST,而在我的环境中,与$_GET$_POST和{{ 1}}变量。

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

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

$_COOKIE

我通过创建$ server_info变量来修改它,如下所示。

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

答案 1 :(得分:5)

我遇到了类似的问题。 $ facebook-&gt; getUser()返回0,有时当用户未实际登录时返回有效的用户ID,当我尝试进行图形api调用时导致Fatal 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'))}");
}

?>

答案 2 :(得分:4)

答案 3 :(得分:3)

您需要确保您的应用设置为从查询字符串而不是uri_fragment中获取代码参数,这可以在Facebook应用页面apps>settings>permissions上设置。

我使用$facebook->getLoginUrl()提供登录网址。

答案 4 :(得分:2)

耗时数小时。 Stack Overflow或其他网站上有关此内容的帖子都没有为我的问题提供解决方案。我终于进入了图书馆代码,并确切地知道它正在死亡的地方。

在我使用XAMPP for Windows的开发机器上,我保持0登录,而我的测试服务器可以正常工作。在意识到异常被抛出但隐藏之后,我在base_facebook.php中放了一个$ e-&gt; getMessage(),它指出我遇到了SSL错误。以下帖子HTTPS and SSL3_GET_SERVER_CERTIFICATE:certificate verify failed, CA is OK引导我找到解决方案。

解决方案:

在base_facebook.php中,在curl_exec($ ch)之前添加以下内容:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

您应该将上面的内容包装在您用于确定您是否处于开发模式的任何标志中,因为您不希望在生产系统中使用上述行。例如:

if ( getenv( 'environment' ) === 'development' ) {
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
}

答案 5 :(得分:2)

检查配置数组。 设置值时,请确保使用正确的字符串封装引号。

$config = array();
$config["appId"] = $APP_ID;
$config["secret"] = $APP_SECRET;
$config["fileUpload"] = false; // optional

这很有效。

$config = array();
$config[‘appId’] = 'YOUR_APP_ID';
$config[‘secret’] = 'YOUR_APP_SECRET';
$config[‘fileUpload’] = false; // optional

这是来自网站http://developers.facebook.com/docs/reference/php/的直接复制/粘贴,由于奇怪的波浪形引号而无效。

答案很长,你的“检查”应用签名的哈希值没有得到正确的检查,因为app secret没有返回有效值(实际上它没有返回任何内容)...所以hash_hmac函数返回的值不正确,等等......

答案 6 :(得分:2)

通过我发现的base_facebook.php进行调试后,由于某种程度上我丢失了我的.crt文件,访问令牌永远无效。请确保您的fb_ca_chain_bundle.crt位于:https://github.com/facebook/facebook-php-sdk/blob/master/src/fb_ca_chain_bundle.crt

答案 7 :(得分:1)

当我面临同样的问题时,我解决了这个问题。 只需转到developers.facebook.com/apps然后导航到您的应用程序 点击EDIT APP按钮

如果你检查了“Facebook上的应用程序”,并输入了一个画布网址 该应用程序将不会在Facebook边工作 将在apps.facebook.com /

下工作

删除此检查对我有用

答案 8 :(得分:1)

我和getUser()有同样的问题,它在IE 8中返回0。我在做了一些研究后找到了一个解决方案。请点击以下链接。这就像一个魅力。

http://www.andugo.com/facebook-php-sdk-getuser-return-0-value-on-ie/

答案 9 :(得分:1)

<?php

require 'facebook.php';

// Create our application instance
// (replace this with your appId and secret).
$facebook = new Facebook(array(
  'appId'  => 'YOUR_APP_ID',
  'secret' => 'YOUR_APP_SECRET',
));

// Get User ID
$user = $facebook->getUser();

// We may or may not have this data based 
// on whether the user is logged in.
// If we have a $user id here, it means we know 
// the user is logged into
// Facebook, but we don’t know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

// Login or logout url will be needed depending on current user state.
if ($user) {
  $logoutUrl = $facebook->getLogoutUrl();
} else {
  $loginUrl = $facebook->getLoginUrl();
}

// This call will always work since we are fetching public data.
$naitik = $facebook->api('/naitik');

?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
  <head>
    <title>php-sdk</title>
    <style>
      body {
        font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
      }
      h1 a {
        text-decoration: none;
        color: #3b5998;
      }
      h1 a:hover {
        text-decoration: underline;
      }
    </style>
  </head>
  <body>
    <h1>php-sdk</h1>

    <?php if ($user): ?>
      <a href="<?php echo $logoutUrl; ?>">Logout</a>
    <?php else: ?>
      <div>
        Login using OAuth 2.0 handled by the PHP SDK:
        <a href="<?php echo $loginUrl; ?>">Login with Facebook</a>
      </div>
    <?php endif ?>

    <h3>PHP Session</h3>
    <pre><?php print_r($_SESSION); ?></pre>

    <?php if ($user): ?>
      <h3>You</h3>
      <img src="https://graph.facebook.com/<?php echo $user; ?>/picture">

      <h3>Your User Object (/me)</h3>
      <pre><?php print_r($user_profile); ?></pre>
    <?php else: ?>
      <strong><em>You are not Connected.</em></strong>
    <?php endif ?>

    <h3>Public profile of Naitik</h3>
    <img src="https://graph.facebook.com/naitik/picture">
    <?php echo $naitik['name']; ?>
  </body>
</html>

答案 10 :(得分:1)

如果用户未对应用进行身份验证,

$facebook->getUser()将返回0。

使用$facebook->getLoginUrl获取用于验证应用的网址。

答案 11 :(得分:1)

我的Facebook应用程序遇到了完全相同的问题,经过2天的挫折后,我终于弄明白了。事实证明getLoginUrl()中的redirect-uri存在问题!如果它通过facebook与注册的应用程序域不匹配,则返回错误,用户返回0(默认用户值)。

答案 12 :(得分:1)

在您的代码中尝试此操作: 如果条件为真,你将被转移到Facebook然后登录自己,我希望你好好去,但记得使用新的PHP SDK库

if(($facebook->getUser())==0)
{
 header("Location:{$facebook->getLoginUrl(array('scope' => 'photo_upload,user_status,publish_stream,user_photos,manage_pages'))}");
 exit;
}
else {
$accounts_list = $facebook->api('/me/accounts');
echo "i am connected";
}

答案 13 :(得分:1)

我检查并测试了很长时间,现在我找到了原因。

请在设置 - > 提前 - > 迁移 - &gt; 离线弃用,登录开发者应用访问 - - &GT;的停用

你会发现$ facebook-&gt; getUser()会起作用。

另一件事。最好在新的facebook类时添加域名;

$facebook = new Facebook(array(
'appId' => APP_ID,//$app_id,
'secret' => APP_SECRET,//$app_secret,
'cookie' => true,
'domain'=>'xxxdomain.com',
));
$session = $facebook->getUser();    

答案 14 :(得分:1)

在一些绝望的时间之后,这就是我的服务器上出现同样问题的原因:如果您使用SSL,确保端口443未被阻止!我去年打开了这个端口,但似乎我的webhoster最近以某种方式重置了。

答案 15 :(得分:0)

确保在任何输出之前调用此Facebook API函数getUser ,因为它使用会话变量和Cookie。如果你这样做,就无法正确发送/读取标题。

答案 16 :(得分:0)

在IE9中添加此行为我解决了这个问题:

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // This is the main cause to use on IE.

答案 17 :(得分:0)

我也花了很多时间看这个并找到了解决方案。可能不适合你,但似乎$ _SERVER ['QUERY_STRING']存在一些问题,所以你需要将它设置为$ _REQUEST数组。

我使用的是codeigniter,发现库加载上面的代码工作正常。

parse_str($ _ SERVER [ 'QUERY_STRING'],$ _ REQUEST);

    parse_str($_SERVER['QUERY_STRING'],$_REQUEST);
    $config = array(); 
    $config["appId"] = "63xxxxx39";
    $config["secret"] = "dexxxx3bf";
    $this->load->library('facebook',$config);

    $this->user = $user = $this->facebook->getUser();
    if ($user) {

        try {
                // Proceed knowing you have a logged in user who's authenticated.
                $user_profile = $this->facebook->api('/me');
                //print_r($user_profile);exit;
        } catch (FacebookApiException $e) {
                echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
                $user = null;
        }
        $logout = $this->facebook->getLogoutUrl();
        $this->fb_logout = $logout;
        $this->fb_user = $user_profile;

    } else {
        $login = $this->facebook->getLoginUrl(array("scope"=>"email","redirect_uri"=>"http://domain/login/login_fbmember/"));
        $this->fb_login = $login;
    }

}

答案 18 :(得分:0)

这个问题真的很奇怪。我发现问题是base_facebook.php中的静态$ CURL_OPTS数组。

尝试从中进行编辑:

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
  );

  /**
   * Default options for curl.
   *
   * @var array
   */
  public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 
  );

答案 19 :(得分:0)

我的具体问题的答案是,我正在使用的JS SDK版本和PHP SDK之间存在不兼容性,只是升级它们解决了它。

当这个问题由各种不同的事情引起时,这个问题的症状是相似的,所以你可以通过本页面提供的不同答案进行侦察。

答案 20 :(得分:0)

这些都是很好的建议,但对我有用的东西是Facebook本身。经过多次重构代码后,我意识到Facebook上的配置存在问题 以下步骤解决了我的问题。

1。)在Basic&gt; Facebook上的应用程序...我取消选择虽然你可以留下它,如果你想要

2。)根据权限&gt;隐私 - &gt;设为公开

权限&gt;验证令牌 - &gt;设置为查询字符串

3。)在高级 - >身份验证&gt;应用类型 - &gt;网络

第三步是真正修复它的那一步,不完全确定为什么,希望有所帮助

答案 21 :(得分:0)

    if ($facebook->getUser()) {
       $userProfile = $facebook->api('/me');
       // do logic
    } else {
       $loginUrl = $facebook->getLoginUrl($params = array('scope' => SCOPE));
       header('Location:' . $loginUrl);
    }

我如何解决我的问题,现在它将返回用户配置文件的详细信息以供进一步处理。 (真是太头疼了)

答案 22 :(得分:0)

如果这个问题仍然与人有关,我想贡献我的2美分,因为我努力工作了很长时间。

首先,尝试适合您的SDK,无论是PHP还是JS。从本质上讲,他们都做同样的事情,只是JS可能会更优雅地处理它(弹出对话框,什么不是)。有一个很多不同的教程,手册和示例!我花了一个星期的时间才找到适合我的1,我可以使用它。一旦找到适合您计划使用的SDK的代码,就可以根据自己的需要更改代码了。

完成代码后,我开始测试它。我注意到我在localhost上运行我的代码,而且我的数组也没有得到任何结果。 要回答您的问题:将您的代码上传到(子)域并重试。我的代码一直在运行,但因为我没有在线,所以它不起作用。如果您已经在线获取,那么我的回答对您没用。

我很抱歉,如果这个小故事真的不是故意的话,那可能对人们有所帮助。

祝你好运!

答案 23 :(得分:0)

当没有登录用户时,facebook-&gt; getUser()将返回0。 (https://developers.facebook.com/docs/reference/php/facebook-getUser/)

要解决此问题,Facebook JS SDK会提供成功登录的访问令牌,您可以将其与Facebook PHP SDK一起使用。

下面的javascript将检查Facebook登录是否已经存在且您的Facebook App是否已获得授权:

FB.getLoginStatus(function($response) {
    if ($response.status === 'connected') {
        var uid = $response.authResponse.userID;
        var accessToken = $response.authResponse.accessToken;
        _accessServer(uid, accessToken);

    } else if ($response.status === 'not_authorized') {
        _loginPopup();

    } else {
        _loginPopup();
    }
});

函数_accessServer将另一个请求打开回服务器,发送访问令牌。

函数_loginPopup应该打开Facebook登录弹出窗口,请求用户具有适当的权限以“允许访问”您的应用程序。

然后PHP应用程序应该将访问令牌传递回Facebook API:

$facebook->setAccessToken($new_access_token);
$uid = $facebook->getUser();

https://developers.facebook.com/docs/reference/php/facebook-setAccessToken/

希望有所帮助。

答案 24 :(得分:0)

getUser(),如果_REQUEST像全局因错误配置而被http服务器丢弃,则PHP-SDK会无声地失败。我使用了错误配置的nginx并在跟踪代码后~3小时通过vhost配置更改解决了这个问题。

我在这里写了一篇关于解决方案的评论:https://github.com/facebook/php-sdk/issues/418#issuecomment-2193699

我希望有所帮助。

答案 25 :(得分:0)

如果您使用新的SDK 3.1.1和JS,则需要将新变量添加到名为

的FB.init例程中

oauth : true 使用新的OATH 2.0协议! 然后更新您的登录按钮,而不允许烫发请使用范围而不是烫发