23

Los registros de mi servidor muestran que el "token de estado 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?El token de estado CSRF no coincide con uno FB PHP SDK 3.1.1 Oauth 2.0

+1

También me gustaría añadir que esto también comenzó a sucederme recientemente. Los usuarios pueden usar la aplicación como se esperaba, sin embargo, mis ideas dejaron de aparecer repentinamente después del 14 de febrero. Al revisar mis registros, veo el mismo error que está obteniendo. –

Respuesta

3

Bueno, he encontrado con este problema exacto una vez, y tuve un problema con los state & code parámetros en la URL - mi archivo .htaccess no se reenvíe.

Supongo que está teniendo el mismo problema.

CSRF state token does not match one provided

espero que esto ayude

+1

¿Cómo resolviste esto? Publique una solución – codecowboy

+0

@codecowboy La resolución específica de este problema depende de las reglas de reescritura. Principalmente, asegúrese de estar pasando los parámetros de la cadena de consulta. – Brad

35

tuve un problema similar la semana pasada, y lo rastreó al campo state ser sobrescritos por varias llamadas a getLoginUrl(). Cada vez que llamas al getLoginUrl(), se genera un nuevo token state en el SDK y se almacena en el $_SESSION (es solo un valor aleatorio), así que si lo llamas dos veces y el usuario usa el primer enlace para iniciar sesión, la segunda llamada tendrá restablecer el token interno state del SDK, y obtendrá este error en sus registros.

El SDK busca la misma state token en la URL regresando después de que Facebook autoriza al usuario y las redirecciona a su sitio, y si no coincide se registrará este error (aquí hay un enlace a la source) .

+0

el enlace está roto :(¿puedes actualizar? – Jakub

+0

@Jakub Facebook movió el repositorio por cualquier razón ... actualizó el enlace. Ya no soy un usuario activo del SDK de PHP, así que no sé si esto todavía está un problema o no. Espero que te ayude. – chesles

+0

@chesles sigue siendo un gran problema, ¡lo encontré ahora mismo! – justinhartman

2

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.

Imagina que tienes una aplicación popular, con miles de usuarios, y ejecuta una acción (un script php) donde publicas una imagen. Algo como esto:

--starting sesión en la parte superior de la secuencia de comandos

--connecting a facebook

--Crear la imagen

--sharing la imagen con la llamada a la API

final --script, la sesión se cierra automáticamente

al hacer esto, la sesión será utilizado por el script durante mucho tiempo sin ninguna razón. que tener cuidado con este tipo de scripts, usar algo como esto en su lugar: Sesión de

--starting justo antes de donde se crea el objeto facebook

--connecting a facebook

--closing sesión con session_write_close() , disponible, otras secuencias de comandos de la matriz sesión puede cargar

--Crear la imagen

--sharing la imagen con la llamada a la API/* se que esto no necesita una sesión. */

--script final, sesión ya cerrada manualmente.

Saludos.

2

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 utiliza un grupo de servidores que tiene configurado para usar Memcache para información de sesión, de lo contrario apache escribirá la información de sesión localmente y si la siguiente solicitud no va al mismo servidor obtendrá el "token de estado CSRF no coincide con uno proporcionado".

Esta fue una de esas cosas que funcionaron como un encanto en un entorno de desarrollo (con un servidor) pero fallaron 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.

1

que tenían el mismo problema en mi máquina local y el problema resultó ser que mi archivo anfitriones estaba bloqueando la comunicación con Verisign, por lo que la URL de Facebook intenta comunicarse con (http://crl.verisign.com/pca3.crl) nunca funcionó (estado: 404) .

Comentando las diversas direcciones IP de Verisign de mi archivo de hosts, ¡funcionó!

+0

¡Está funcionando para mi caso! – secretlm

0

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

8

Código de Facebook SDK 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 indica señal no válida si se llama dos veces.

Para ser claros la función puede ser llamada dos veces en el mismo controlador de URL si, por ejemplo:

$facebook->getUser(); y luego en el mismo controlador de $facebook->getLogoutUrl() entonces el getCode() se llama dos veces así resultante en y de error no válido mensaje

+0

También hay un tirón solicitud que corrige esto si alguien quiere fusionarlo: https://github.com/facebook/facebook-php-sdk/pull/122 –

+0

Como segundo comentario, conserve este código. Aunque las fusiones en fb repo esto se sobrescribió de nuevo y hubo otro compromiso que fue rechazado –

0

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

2

Tuve el mismo problema. Es fácil. No te llame

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

antes

$fbUser = $facebook->getUser(); 

de lo contrario obtendrá "simbólico Estado CSRF no coincide con uno proporcionado" error.

Cuestiones relacionadas