Facebook PHP SDK - getUser()突然返回0

时间:2012-11-27 17:16:27

标签: php facebook facebook-php-sdk facebook-login

首先,为了解决这个问题,我花了几个小时在StackOverflow上查看这个问题的答案,并尝试自己解决它,但它只是不起作用(不再)了。所以无论如何...

昨天,一切正常。去睡觉,醒来,用facebook登录在我的2个网站上不再工作了。登录链接将我发送到Facebook页面,这需要我批准应用程序,但在它重定向回到网站后,它不会登录我。我很快跟踪问题,getUser()总是返回0.所以我使用非常非常基本的代码设置一个新的(测试)应用程序,只是为了看看它是否有效。它没有。这是代码:

<?php

        session_start();

        require_once("facebook.php");

        $config = array();
        $config['appId'] = '199971880127910'; //test app so I don't mind showing these
        $config['secret'] = 'e065588cb1edd96f821de8b3d362c488';
        $config['trustForwarded'] = true;

        $facebook = new Facebook($config);

        try {
            $user = $facebook->getUser();
            var_dump($user);

        } catch (Exception $e) {
            $e->getMessage();
        }

        $loginUrl = $facebook->getLoginUrl(array('redirect_uri' => 'http://gtcrais.redirectme.net/test/'));

        echo "<a href='".$loginUrl."'>Login</a>";
?>

here中的第二个答案引起了我的注意。我尝试了这个解决方案并且它不起作用,所以我打开了base_facebook.php并滚动到“代码”传递给某个变量的行 - 第458行:

  

$ code = $ this-&gt; getCode();

我回应了这一点,它正确显示了从URL传递的代码参数。有问题的一行原来是那一行以下的一对行:

  

$ access_token = $ this-&gt; getAccessTokenFromCode($ code);

当传递$ code变量时,此函数向$ access_token返回false值。在该函数中,这部分代码抛出异常:

try {
      // need to circumvent json_decode by calling _oauthRequest
      // directly, since response isn't JSON format.
      $access_token_response =
        $this->_oauthRequest(
          $this->getUrl('graph', '/oauth/access_token'),
          $params = array('client_id' => $this->getAppId(),
                          'client_secret' => $this->getAppSecret(),
                          'redirect_uri' => $redirect_uri,
                          'code' => $code));
    } catch (FacebookApiException $e) {
      // most likely that user very recently revoked authorization.
      // In any event, we don't have an access token, so say so.
      print_r($e);
      return false;
    }

print_r($ e)显示了一大堆乱码(我有点像菜鸟,所以我几乎无法阅读任何有意义的东西)。我在那里看到的唯一重复是

  

SSL证书问题,验证CA证书是否正常。详细信息:错误:14090086:SSL

这就是我调试它的程度。任何帮助表示赞赏。再一次,昨天,一切都运转良好。今天,如果没有一行代码更改,它就不再起作用了。令人难以置信=(哦,是的,我正在使用PHP 5.4.3运行WAMP

编辑:这是错误消息:http://i.imgur.com/TeY8h.png

EDIT2:解决了:

在base_facebook.php中,在$ CURL_OPTS下添加以下两行:

CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => 2

这使它......

public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => 2
  );

我不确定这是多少安全问题,但是它使登录与Facebook工作,所以你有它(并且我有它。整天失去了这个,fml)。

EDIT3:已发布的新SDK解决了此问题:https://github.com/facebook/facebook-php-sdk

4 个答案:

答案 0 :(得分:8)

在base_facebook.php中,在$ CURL_OPTS下添加以下两行:

CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => 2

这使它......

public static $CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_USERAGENT      => 'facebook-php-3.2',
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => 2
  );

我不确定这有多大的安全问题,但它使登录与Facebook工作,所以你有它。

编辑:发布了修复此问题的新SDK:https://github.com/facebook/facebook-php-sdk

答案 1 :(得分:1)

我认为在调用任何facebook方法之前你需要setAccessToken(),即使用户已经授权你的应用并登录了。

答案 2 :(得分:0)

我遇到了同样的问题。 原来我使用的是localhost 。虽然facebook上出现了允许访问对话框,但我被重定向回我的网页,getUser仍然返回零。

  

我的解决方案

一旦我上传了我的代码,并且 在线测试了 ,就会出现合理的Facebook错误,然后必须将我的“App Domains”和“Site Url”更改为我的相关值在线测试网站不是localhost。然后它奏效了!

答案 3 :(得分:0)

我遇到了这个问题,结果证明这是一个腐败的证书。我想我在Git中打开了autocrlf。我不知道是否修复了它,但是把我的整个仓库吹走并从源头重新克隆导致这个问题清除了!