La autenticación de HybridAuth/PHP Facebook SDK falló(getUser devuelve 0)
login social php (4)
Estoy tratando de configurar HybridAuth y estoy en las primeras etapas. En este momento, todo lo que quiero hacer es conectarme y asegurarme de que HA redireccionará a Facebook y solicitará la instalación de la aplicación, luego autenticará al usuario cuando regrese.
Estoy llamando manualmente a lo siguiente desde: http://mydomain.com/auth.php?provider=Facebook
auth.php se ve así:
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();
}
}
Funciona porque reenvía a Facebook y le pide que instale la aplicación correcta con los permisos apropiados. Eso me dice que mi configuración HA está funcionando bien. Instalo la aplicación con éxito y luego redirige a la página, donde recibo el mensaje:
Authentification failed! Facebook returned an invalide user id.
¿Lo que da? Mi aplicación muestra 0 agregaciones y 0 llamadas de API en el panel de control de FB también (aunque esta información parece que podría retrasarse unos días). ¿Estoy esperando que FB habilite la aplicación de alguna manera? ¿Estoy haciendo algo mal?
ACTUALIZAR
HybridAuth usa el SDK de Facebook, así que traté de eliminar HA de toda la ecuación. Ejecutando el siguiente ejemplo básico:
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);
He iniciado sesión en Facebook y he agregado la aplicación, pero no importa lo que haga, la identificación de usuario devuelve 0. He intentado utilizar también a los usuarios de la prueba, sin ningún resultado. ¿Hay algún problema de configuración del servidor que podría estar perdiendo aquí?
Moví mi código a una aplicación / servidor diferente y luego a la misma aplicación en un servidor diferente y todo funcionó bien. Así que comencé a buscarlo como un problema de configuración del servidor. Resulta que a Facebook no le gustó el certificado autofirmado en mi servidor de desarrollo.
Pude resolver este problema alterando la clase base_facebook.php en el PHP SDK y agregando el curlopt para ignorar el paso de verificación SSL. Vea abajo:
public static $CURL_OPTS = array(
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
CURLOPT_USERAGENT => ''facebook-php-3.1'',
CURLOPT_SSL_VERIFYPEER => false
);
Pude averiguar por qué aparece este error incluso en la versión actual de hybridauth y facebook sdk.
La razón está en la forma en que hybridauth y google o facebook sdk crean el parámetro redirect_uri. Como sabemos por https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/ primero tenemos que redirigir al usuario a Facebook (con redirect_uri param) y devuelve el código en respuesta por defecto. Luego enviamos la solicitud http usando curl nuevamente (con redirect_uri param) y estas URL no coinciden, debido a la razón mencionada anteriormente.
Otras palabras si configuras hybridauth config "base_url" => "http://
(sin barra) -> funcionará bien para google, pero te dará este estúpido mensaje de error para iniciar sesión en Facebook. yourhost
/hybridauth/hybridauth"
"base_url" => "http://
, (con barra inclinada) funcionará bien con facebook pero dará como resultado un error con google con el error claro "Redirect Uri missmatch". yourhost
/hybridauth/hybridauth/"
Así que no es la mejor solución rápida "base_url" => "http://
" (sin barra) en config. yourhost
/hybridauth/hybridauth
Y luego elegir cómo construir uri depende del proveedor.
en Provider_Adapter.php línea de comentario 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}";
y agrega estos dos en su lugar.
$dlm = $this->id == "Facebook" ? "/?" : "?";
$ this-> params ["login_done"] = $ HYBRID_AUTH_URL_BASE. (strpos ($ HYBRID_AUTH_URL_BASE, $ dlm)? ''&'': $ dlm). "hauth.done = {$ this-> id}";
De esta forma tenemos una solución para admitir tanto a Facebook como a Google.
Para cualquier otra persona que se encuentre con esto y la respuesta anterior no funciona, estaba enfrentando el mismo problema y resultó que mi aplicación en Facebook todavía estaba en modo Sandbox. Apagar esto en la configuración de la aplicación resultó resolver el problema de obtener una ID de usuario 0.
La autenticación híbrida agrega una serie de "0" en el parámetro de alcance. No estoy seguro de cuán buena es la idea de modificar la clase Hybrid auth core, pero acabo de modificar la función loginBegin en Hybrid / Providers / Facebook.php y está funcionando bien ahora:
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 );
}