HybridAuth / PHP Facebook SDK 身份验证失败(getUser 返回 0)


HybridAuth / PHP Facebook SDK authentication failed (getUser returns 0)

我正在尝试配置HybridAuth,我处于非常早期的阶段。 现在我想做的只是连接并确保 HA 将重定向到 facebook 并提示安装应用程序,然后在用户返回时对用户进行身份验证。

我正在从以下位置手动调用以下内容:http://mydomain.com/auth.php?provider=Facebook

身份验证.php如下所示:

session_start();
require_once($_SERVER['DOCUMENT_ROOT'] . "/func/db_connect.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/api/auth/Hybrid/Auth.php");      // HybridAuth Module 
$hybridauth_config = include($_SERVER['DOCUMENT_ROOT'] . '/api/auth/config.php');
if ($_GET['provider'] == '' || !in_array($_GET['provider'], array_keys($hybridauth_config['providers']))) {
    echo 'Invalid Provider';
} else {
    try { 
        $hybridauth = new Hybrid_Auth($hybridauth_config);
        // try to authenticate with this provider
        $adapter = $hybridauth->authenticate($_GET['provider']);
        // grab user profile
        if ($hybridauth->isConnectedWith($f_provider)) {
            // yep, we're connected.  Add this provider's info to the user_auth table
            echo 'connection successful';
        }
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}

它的工作原理是转发到 Facebook 并提示安装具有适当权限的正确应用程序。 这告诉我我的 HA 配置工作正常。 我成功安装了该应用程序,然后它重定向回页面,在那里我收到消息:

Authentification failed! Facebook returned an invalide user id.

什么给? 我的应用程序在FB控制面板中也显示0个添加和0个API调用(尽管此数据看起来可能会延迟几天)。 我是否在等待FB以某种方式启用该应用程序? 我做错了什么吗?

更新

HybridAuth使用Facebook SDK,所以我试图从整个等式中消除HA。 运行以下基本示例:

session_start();
require($_SERVER['DOCUMENT_ROOT'] . "/path/to/fbsdk/facebook.php");
$facebook = new Facebook(array(
  'appId'  => 'myappid',
  'secret' => 'myappsecret',
  'fileUpload' => true
));
$user = $facebook->getUser();
var_dump($user);

已登录Facebook并添加了应用程序,但无论我做什么,用户ID都返回0。 我也尝试使用测试用户 - 无济于事。我在这里可能缺少一些服务器配置问题吗?

我将代码移动到不同的应用程序/服务器,然后移动到不同服务器上的同一应用程序,一切正常。 所以我开始将其作为服务器配置问题进行研究。 事实证明,Facebook不喜欢我的开发服务器上的自签名证书。

我能够通过更改 PHP SDK 中的 base_facebook.php 类并添加 curlopt 以忽略 SSL 验证步骤来解决此问题。 见下文:

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

我已经设法弄清楚为什么即使在当前版本的 hybridauth 和 facebook sdk 中也会出现此错误。

原因在于 hybridauth 和 google 或 facebook sdk 如何构建redirect_uri参数。正如我们从 https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/首先知道的那样,我们必须将用户重定向到 facebook(带有redirect_uri参数),默认情况下它会返回代码作为响应。比我们再次使用 curl 发送 http 请求(带有 redirect_uri 参数),由于前面提到的原因,这些 url 不匹配。

如果您在混合身份验证配置中设置的其他词 "base_url" => "http://yourhost/hybridauth/hybridauth"(不带斜杠)->它对谷歌来说工作正常,但给你这个愚蠢的消息错误,用于Facebook登录。

"base_url" => "http://yourhost/hybridauth/hybridauth/", (带斜杠 ) 在 facebook 上可以正常工作,但会导致谷歌出错,并出现明显的错误"重定向 Uri missmatch"。

所以不是最好的快速修复是配置中的"base_url" => "http://yourhost/混合身份验证/混合身份验证"(没有斜杠)。

然后根据提供程序选择如何构建 uri。

在 Provider_Adapter.php 评论行 131 // $this->params["login_done"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.done={$this->id}";

并添加这两个。

$dlm = $this->id == "Facebook" ? "/?" : "?";

$this->params["login_done"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, $dlm ) ? '&' : $dlm ) . "hauth.done={$this->id}";

这样,我们就有了支持Facebook和谷歌的解决方案。

对于遇到此问题并且上面的答案不起作用的其他任何人,我遇到了同样的问题,结果我在 Facebook 上的应用程序仍处于沙盒模式。在应用程序设置下关闭此功能可以解决获取 0 用户 ID 的问题。

混合身份验证在范围参数中添加了一系列"0"。我不确定修改混合身份验证核心类的想法有多好,但我刚刚修改了混合/提供者/Facebook 中的 loginBegin 函数.php它现在工作正常:

function loginBegin()
{
  $parameters = array("scope" => $this->scope, "redirect_uri" => $this->endpoint, "display" => "page");
  $optionals  = array("scope", "redirect_uri", "display");
  foreach ($optionals as $parameter){
    if( isset( $this->config[$parameter] ) && ! empty( $this->config[$parameter] ) ){
      $parameters[$parameter] = $this->config[$parameter];
    }
  }
  if (isset($parameters['scope'])) {
    foreach ($parameters['scope'] as $key => $parameter){
      if ($parameter == '0') {
        $parameters['scope'][$key] = '';
      }
    }
  }
  // get the login url 
  $url = $this->api->getLoginUrl( $parameters );
  // redirect to facebook
  Hybrid_Auth::redirect( $url );
}