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

2019-06-23 22:59发布

我想配置HybridAuth,我在很早的阶段。 现在,所有我想做的是连接并确保医管局会重定向到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.

是什么赋予了? 我的应用程序显示0增加,并在FB控制面板0的API调用太(虽然这数据看起来可能会延迟几天)。 我在等待FB,使以某种方式应用程序? 难道我做错了什么?

UPDATE

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,我使用测试用户尝试以及 - 无济于事。 有一些服务器的配置问题,我会在这里失去了?

Answer 1:

我搬到我的代码到不同的应用程序/服务器,然后在相同的应用程序在不同的服务器上,一切工作正常。 于是我开始寻找到它作为服务器配置的问题。 原来的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
  );


Answer 2:

我设法弄清楚为什么这个错误hybridauth和Facebook SDK的最新版本甚至出现。

究其原因,hybridauth和谷歌或Facebook SDK如何建立REDIRECT_URI参数的方式。 因为我们知道从https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/首先我们还是要用户重定向至Facebook(与REDIRECT_URI PARAM),它响应由返回代码默认。 比我们再次发送使用curl http请求(与REDIRECT_URI PARAM)而这些网址不匹配,因为之前提到的原因。

如果您在hybridauth配置设置换句话说"base_url" => "http:// yourhost /hybridauth/hybridauth" (不带斜杠) - >它会正常工作的谷歌,但给你的Facebook登录这个愚蠢的错误消息。

"base_url" => "http:// yourhost /hybridauth/hybridauth/"与斜线)将工作确定与facebook反而会造成与清除错误谷歌错误“的重定向URI missmatch”。

所以不是最好的速战速决是"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}"; // $this->params["login_done"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.done={$this->id}";

并添加这两种相反。

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

$这 - > PARAMS [ “login_done”] = $ HYBRID_AUTH_URL_BASE。 (strpos($ HYBRID_AUTH_URL_BASE,$ DLM) '和':$ DLM)。 “hauth.done = {$这 - > ID}”;

这样的方式,我们有解决方案,同时支持Facebook和谷歌。



Answer 3:

对于其他人来翻过这一点,并回答上述方法无效,我面临同样的问题,一个原来我在Facebook上的应用程序仍然在沙盒模式。 在原来的应用程序设置关闭这个选项来解决得到一个0的用户ID的问题。



Answer 4:

混合身份验证添加范围参数一系列的“0”。 我不知道有多好,这个想法改变混合身份验证核心类的,但我只是在混合/供应商/ 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 );
}


文章来源: HybridAuth / PHP Facebook SDK authentication failed (getUser returns 0)