8

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

昨天,一切正常。上床睡觉,醒来,在我的 2 个网站上使用 facebook 登录不再起作用。登录链接将我发送到需要我批准该应用程序的 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>";
?>

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

$code = $this->getCode();

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

$access_token = $this->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证书是否OK。详细信息:错误:14090086:SSL

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

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

EDIT2:已解决:

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

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

4 回答 4

8

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

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

于 2012-11-27T19:50:44.710 回答
1

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

于 2013-02-13T11:55:45.617 回答
0

我有同样的问题。原来我使用的是 localhost。尽管允许访问对话框出现在 facebook 上并且我被重定向回我的网页,但 getUser 仍然返回零。

我的解决方案

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

于 2013-11-26T07:32:29.443 回答
0

我遇到了这个问题,结果证明这是一个损坏的证书。我想我在 Git 中打开了 autocrlf。我不知道这是否解决了它,但是吹走我的整个回购并从源头重新克隆导致这个问题立即解决!

于 2014-02-03T20:06:25.353 回答