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
Respuesta
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
¿Cómo resolviste esto? Publique una solución – codecowboy
@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
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) .
el enlace está roto :(¿puedes actualizar? – Jakub
@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
@chesles sigue siendo un gran problema, ¡lo encontré ahora mismo! – justinhartman
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.
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.
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ó!
¡Está funcionando para mi caso! – secretlm
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.
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
También hay un tirón solicitud que corrige esto si alguien quiere fusionarlo: https://github.com/facebook/facebook-php-sdk/pull/122 –
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 –
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
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.
- 1. OAuth 2.0 Token y Lifetime
- 2. OAuth 2.0. No hay sesión? (Sin estado)
- 3. Oauth 2.0 no puede obtener un token de acceso del valor 'código' signed_request
- 4. FB JS-SDK no puede detectar el inicio de sesión del usuario de FB directamente
- 5. usando require.js con FB SDK
- 6. intercambio FB API token de falta redirect_uri
- 7. token de CSRF para ajax
- 8. de repente, getUser devolvió 0. (PHP 3.1.1 SDK)
- 9. CSRF token generation
- 10. Problema de token de CSRF con CodeIgniter
- 11. token anti-CSRF y Javascript
- 12. token csrf usando
- 13. Acceda a Imap de Gmail con el token de acceso de OAuth 2.0
- 14. Rails, OAuth y protección CSRF
- 15. CSRF Token faltante o incorrecto
- 16. Android y OAUTH 2.0
- 17. FB SDK 3.0 ¿Debo extender el token de acceso o es automático?
- 18. Solicite el token OAuth de BitBucket
- 19. Django CSRF Token sin formularios
- 20. OAuth 2.0 Authorization Header
- 21. Jquery y Django CSRF Token
- 22. Obtener el token CSRF en la prueba
- 23. Como: Generar dinámicamente CSRF token en WTForms con el frasco
- 24. ¿Necesito un token CSRF para jQuery .ajax()?
- 25. Obtén datos de Google Analytics con el token de Oauth?
- 26. OAuth - Token no válido: token de solicitud utilizado cuando no está permitido
- 27. FB auth.logout se está iniciando después de haber iniciado sesión utilizando "server-side-workflow" (OAuth 2.0)
- 28. La integración de OAuth 2.0 con CodeIgniter
- 29. Iniciar sesión con FB Connect/Google OAuth en .NET
- 30. ¿Cómo debo comenzar con el servidor de OAuth en PHP
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. –