El token de estado CSRF no coincide con el proporcionado por FB PHP SDK 3.1.1 Oauth 2.0

Los registros de mi servidor muestran que el “token de estado de CSRF no coincide con el proporcionado”, que parece ocurrir para casi todos los usuarios. Sin embargo, los usuarios son creados y / o autenticados y puedo recuperar la información del usuario. Estoy usando un servidor Linux con Apache. También estoy usando el último PHP PHP SDK v.3.1.1 ¿Alguien puede decirme por qué sucede esto y cómo solucionarlo?

Tuve un problema similar la semana pasada y lo getLoginUrl() hasta el campo de state sobrescrito por múltiples llamadas a getLoginUrl() . Cada vez que llamas a getLoginUrl() , se genera un nuevo token de state en el SDK y se almacena en $_SESSION (es solo un valor aleatorio), por lo que si lo llamas dos veces y el usuario usa el primer enlace para iniciar sesión, el segundo la llamada restablecerá el token de state interno del SDK, y obtendrá este error en sus registros.

El SDK busca el mismo token de state en la URL que vuelve después de que Facebook autoriza al usuario y lo redirige a su sitio, y si no coincide, registrará este error (aquí hay un enlace al origen ).

El código SDK de Facebook tiene un error al verificar contra tokens dos veces en el mismo controlador.

Edité la función getCode de facebook.php así:

 protected function getCode() { if (!isset($_REQUEST['code']) || !isset($_REQUEST['state']) || $this->state === null) { return false; } if ($this->state === $_REQUEST['state']) { // CSRF state has done its job, so clear it $this->state = null; $this->clearPersistentData('state'); return $_REQUEST['code']; } self::errorLog('CSRF state token does not match one provided.'); return false; } 

para ser más claro y no declara el token inválido si se llama dos veces.

Para que quede claro, la función se puede llamar dos veces en el mismo controlador de URL si, por ejemplo:

$facebook->getUser(); y luego, en el mismo controlador $facebook->getLogoutUrl() se getCode() al getCode() dos veces, lo que da como resultado un mensaje de error no válido

Bueno, una vez me encontré con este problema y tuve un problema con los parámetros de state y code en la URL: mi archivo .htaccess no los reenviaba.

Supongo que estás teniendo el mismo problema.

El token de estado CSRF no coincide con uno proporcionado

Espero que esto ayude

Para agregar un poco a la respuesta de chesles, este problema puede ocurrir si está jugando con las funciones session_start () – session_write_close (), como yo lo hice.

Si no hay una sesión iniciada cuando solicita el loginUrl, obtendrá este error.

Sidenote: ¿Por qué molestarse en detener la sesión?

Las secuencias de comandos que usan sesiones se detienen entre sí, porque están esperando que la matriz de sesión esté disponible para su uso.

Imagine que tiene una aplicación popular, con miles de usuarios, y tiene una acción (un script php) donde publica una imagen. Algo como esto:

–starting session en la parte superior del script

–conectándose a Facebook

–crear la imagen

–compartiendo la imagen con la llamada api

–script end, la sesión se cierra automáticamente

Al hacer esto, la secuencia de comandos será utilizada por el script durante mucho tiempo sin ningún motivo. Tenga cuidado con tales scripts, use algo como esto en su lugar:

– Comenzando la sesión justo antes de crear el objeto facebook

–conectándose a Facebook

–cierre de la sesión con session_write_close (), la matriz de sesiones está disponible, otras secuencias de comandos pueden cargar

–crear la imagen

–compartiendo la imagen con la llamada de API / * Cree que esto no necesita una sesión. * /

–script final, sesión ya cerrada manualmente.

Aclamaciones.

Una nota adicional: aunque no está indicado en la documentación de Facebook PHP API, debe tener apache configurado para sesiones PHP para que el proceso de inicio de sesión funcione. Ese resultó ser el problema que encontramos cuando recibimos el “token de estado CSRF no coincide con uno proporcionado”.

Asegúrese de que si está utilizando un grupo de servidores que tiene configurado para usar Memcache para la información de la sesión, de lo contrario apache escribirá la información de la sesión localmente y si la próxima solicitud no va al mismo servidor obtendrá el “estado CSRF” token no coincide con uno proporcionado “.

Esta fue una de esas cosas que funcionó como un encanto en un entorno de desarrollo (con un servidor) pero falló en la producción.

También tuvimos que reconfigurar nuestra configuración de CDN para asegurarnos de que estábamos pasando por la cookie de sesión de PHP.

Tuve el mismo problema. Es fácil. No llames

 $fbLoginUrl = $facebook->getLoginUrl(...); 

antes de

 $fbUser = $facebook->getUser(); 

de lo contrario, obtendrá el error “El token de estado CSRF no coincide con el proporcionado”.

Tuve el mismo problema en mi equipo local y el problema fue que mi archivo de hosts bloqueaba la comunicación con Verisign, por lo que la URL Facebook intenta comunicarse con ( http://crl.verisign.com/pca3.crl ) nunca trabajado (estado: 404).

Comentando las diversas direcciones IP de Verisign de mi archivo de hosts, ¡hizo el truco!

El estado y el código de CSRF se verifican usando sesiones locales, apuesto a que debe verificar su session.save_handler en su php.ini, y si estaba funcionando correctamente.

si utiliza .htaccess mod reescribe los redireccionamientos en su página, use el [QSA] (Query String Append) al final de las líneas para preservar las variables GET, o bien perdió la variable $ code, que se requiere para el inicio de sesión de Facebook