我正在尝试配置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 );
}