1

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

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

auth.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。我也尝试过使用测试用户 - 无济于事。我可能在这里遗漏了一些服务器配置问题吗?

4

4 回答 4

5

我将我的代码移动到不同的应用程序/服务器,然后移动到不同服务器上的同一个应用程序,一切正常。因此,我开始将其视为服务器配置问题。原来 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
  );
于 2012-04-26T20:31:08.733 回答
0

For anyone else coming accross this and the answer above doesn't work, I was facing the same issue an turns out my app on Facebook was still in Sandbox mode. Turning this off under the app settings turned out to solve the issue of getting a 0 user id.

于 2013-11-28T02:07:25.670 回答
0

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

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 );
}
于 2014-03-07T06:43:19.993 回答
0

我已经设法弄清楚为什么即使在当前版本的 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 不匹配,因为前面提到的原因。

换句话说,如果您在 hybridauth 配置中设置 (不带斜杠)-> 它适用于 google,但会给您这个用于 facebook 登录的愚蠢消息错误。"base_url" => "http://yourhost/hybridauth/hybridauth"

"base_url" => "http://yourhost/hybridauth/hybridauth/", (带有斜线)可以在 facebook 上正常工作,但会导致 google 出现错误,并出现明显的错误“重定向 Uri 不匹配”。

因此,快速修复不是最好的方法是配置中的“(不带斜线)。"base_url" => "http://yourhost/hybridauth/hybridauth

然后根据提供者选择如何构建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 和 Google 的解决方案。

于 2013-11-15T12:01:07.417 回答