facebook - studio - El parámetro "estado" de la URL y la sesión no coinciden
powerapps studio (11)
En realidad, podría estar analizando los datos de otro dominio ... por ejemplo: website.com es diferente de www .website.com
Si está analizando datos de http: //website.com/login.php a http://www.website.com/fb-callback.php esto sería un problema de dominio cruzado y el error que está recibiendo sería por eso....
http: //website.com y http: //www.website.com son los mismos, pero el script los identifica como diferentes ..... espero que esto nos ayude a comprender mejor el problema.
En facebook documantion
require(''include/facebook/autoload.php''); //SDK directory
$fb = new Facebook/Facebook([
''app_id'' => ''***********'',
''app_secret'' => ''***********************''
]);
$helper = $fb->getRedirectLoginHelper();
$permissions = [''email'', ''public_profile'']; // optional
$loginUrl = $helper->getLoginUrl(''http://www.meusite.com.br/login-callback.php'', $permissions);
Cuando lo dirija a la url $ loginUrl, la devolución es: Facebook SDK devolvió un error: la validación de falsificación de solicitud entre sitios falló. El parámetro "estado" de la URL y la sesión no coinciden
Este problema fue un poco confuso para mí, porque tuve que cambiar una línea en el archivo src de facebook:
src/Facebook/Helpers/FacebookRedirectLoginHelper.php
en la función: "validateCsrf" como esto:
if ($result !== 0) {
throw new FacebookSDKException(''Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'');
}
Y cambiarlo en:
if ($result === 0) {
throw new FacebookSDKException(''Cross-site request forgery validation failed. The "state" param from the URL and session do not match.'');
}
No sé si esto constituye una violación de la seguridad del SDK de Facebook, así que realmente me abrí a cualquier explicación o recomendación para esta respuesta.
También puede realizar los siguientes cambios en el administrador de aplicaciones de Facebook:
agrega tu sitio y devuelve la llamada a tu cuenta de la aplicación de Facebook en:
setting->advanced:Valid OAuth redirect URIs
No olvide agregar otra url con barra diagonal (/) al final de cada url y marque las 4 casillas de verificación en Configuración de OAuth del cliente.
Este problema ocurre también en caso de que genere 2 o más enlaces de inicio de sesión en la misma página (por ejemplo, uno para el inicio de sesión y otro para el registro; incluso ambos apuntan a la misma URL, solo tienen etiquetas diferentes).
El SDK de Facebook crea / actualiza $ _SESSION [FBRLH_state] para cada nuevo loginURL generado. Entonces, si hay 2 URL generadas (usando $ helper-> getLoginUrl ()) entonces $ _SESSION [FBRLH_state] se reescribe 2 veces y es válido solo para la última URL generada. La URL de inicio de sesión anterior se vuelve inválida. Esto significa que no es posible generar 2 loginURLs válidos. En caso de que se generen 2 URL iguales , devuelva la primera y evite llamar al SDK de Facebook para generar la segunda.
Finalmente, al buscar en el código FB, descubrí que el problema "La validación de falsificación de solicitud entre sitios falló. El" estado "requerido" falta "y similares son causados por la variable PHP $ _SESSION [''FBRLH_state''] que por alguna razón" extraña " FB llama al archivo de devolución de llamada.
Para resolverlo, almaceno esta variable "FBRLH_state" DESPUÉS de la llamada de la función $ helper-> getLoginUrl (...). Es muy importante hacerlo solo después de que la llamada de esta función se deba a que está dentro de esta función cuando se rellena la variable $ _SESSION [''FBRLH_state''].
A continuación un ejemplo de mi código en el login.php:
$uri=$helper->getLoginUrl($uri, $permissions);
foreach ($_SESSION as $k=>$v) {
if(strpos($k, "FBRLH_")!==FALSE) {
if(!setcookie($k, $v)) {
//what??
} else {
$_COOKIE[$k]=$v;
}
}
}
var_dump($_COOKIE);
Y en el login-callback.php antes de llamar a todos los códigos FB:
foreach ($_COOKIE as $k=>$v) {
if(strpos($k, "FBRLH_")!==FALSE) {
$_SESSION[$k]=$v;
}
}
Por último, pero no menos importante, recuerde también incluir código para la sesión de PHP, así que ...
if(!session_id()) {
session_start();
}
...
...
...
...
<?php session_write_close() ?>
Espero que esta respuesta pueda ayudarte a ahorrar entre 8 y 10 horas de trabajo :) Adiós, Alex.
Podría haber 2 razones para este error:
- no
session_start();
asession_start();
antes de la llamadagetLoginUrl
- Ejecutó nuevamente
getLoginUrl
enlogin-callback.php
, por lo que el valor del estado se regeneró y no coincide con el valor redirigido
Posibles soluciones: utilicé los siguientes ajustes de configuración.
Habilitar WebAuthLogin en la pestaña avanzada. Proporcione la url en los ajustes de WebAuthLogin de la misma manera que la que proporcionó en $ loginUrl;
Por ejemplo, si usa $ loginUrl como https://example.com/ use el mismo en la URL de WebAuthlogin $ loginUrl = $ helper-> getLoginUrl ('' https://example.com/ '', $ permisos);
Sucede cuando a la sesión le falta una variable necesaria. Puede ser causada por varias cosas. En mi caso, dejé el "www" fuera de la URL de devolución de llamada
Tuve el mismo problema y para mí ese error estaba ocurriendo porque no puse session_start();
en el código de mi página login.php antes de llamar a getLoginUrl (..) y también en la parte superior de la página login-callback.php .
Simplemente ponga session_start();
en su página de " inicio de sesión " y en la página de " devolución de llamada de inicio de sesión " y funcionará seguramente como lo es para mí ahora.
Yo tenía el mismo error. ¿Estás usando 1 archivo o 2? Estaba tratando de obtener utilizando 1 archivo, pero mi error se resolvió cuando me dividí en login.php & fb-callback.php como se recomienda en la documentación. Mis sesiones se reescribieron para que el estado nunca se guardara correctamente.
¡Buena suerte!
Yo tenía el mismo error.
El problema se produjo porque hice getLoginUrl (...) antes de getAccessToken ()
Así que deshacerse de getLoginUrl (...) en la URL redirigida y el código debería funcionar.
Yo tuve el mismo problema.
La razón de este error es porque --->
Cuando "$ helper-> getLoginUrl" llama, crea una variable de sesión "FB_State", y esto es algo que FB usa para hacer coincidir el token. Cada vez que getLoginUrl llama, crea un nuevo estado. Luego, después de que el usuario haya autorizado y redirigido, si los códigos no pueden detectar este evento y se vuelve a ejecutar "$ helper-> getLoginUrl", se producirá este error.
La solución ->
refine su codificación, deje de ejecutar "$ helper-> getLoginUrl" nuevamente si está autorizado.
si ya lo has vuelto a ejecutar, entonces establece la variable de sesión para el token en NULL si lo tienes, entonces el Usuario puede volver a autorizar nuevamente.
cuando el usuario intenta volver a autorizar, puede eliminar la APP autorizada una vez o necesita generar un nuevo enlace con "$ helper-> getReRequestUrl"
Sin embargo, el token ha sido llamado por "getAccessToken ()" antes de que se ejecute "$ helper-> getLoginUrl" o "$ helper-> getReRequestUrl".
¡¡¡¡¡Buena suerte!!!!!