我想配置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,我使用测试用户尝试以及 - 无济于事。 有一些服务器的配置问题,我会在这里失去了?
我搬到我的代码到不同的应用程序/服务器,然后在相同的应用程序在不同的服务器上,一切工作正常。 于是我开始寻找到它作为服务器配置的问题。 原来的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和谷歌或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和谷歌。
对于其他人来翻过这一点,并回答上述方法无效,我面临同样的问题,一个原来我在Facebook上的应用程序仍然在沙盒模式。 在原来的应用程序设置关闭这个选项来解决得到一个0的用户ID的问题。
混合身份验证添加范围参数一系列的“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 );
}