2011-09-07 17 views
5

Hice algunas búsquedas y no encontré nada que estuviera relacionado con mi problema.Problema con el inicio de sesión de Facebook no coincide con el token de estado CSRF

Actualmente estoy tratando de implementar un inicio de sesión de Facebook en mi sitio web y tengo problemas con la autenticación de inicio de sesión debido a las URL de reescritura mod de htaccess?

El código funciona perfectamente y mi sesión de usuario en si lo uso sin las reglas de reescritura mod como:

domain.com/view_webhosting.php?webhosting=name 

Pero en cuanto me acerco a la reescritura de URL mod

domain.com/webhosting-name/ 

Entonces simplemente no funciona y arroja un error "El token de estado CSRF no coincide con el proporcionado".

en el archivo .htaccess parece que este

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

Alguien tiene una solución a un problema como este? Estoy usando Facebook SDK v3.1.1

Respuesta

7

El SDK PHP espera que el campo 'Estado' para estar en $ _REQUEST (creo que un parámetro GET) después del redireccionamiento antes de poder intercambiar el 'código' por un token de acceso. Desde base_facebook.php:

protected function getCode() { 
    if (isset($_REQUEST['code'])) { 
    if ($this->state !== null && 
     isset($_REQUEST['state']) && 
     $this->state === $_REQUEST['state']) { 

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

    return false; 
} 

Su RewriteRule puede estar pisoteando ese parámetro.

2

Supongo que se refiere al PHP SDK?

Parece que no está pasando la variable de solicitud 'estado' a su script PHP. ¿Has leído https://developers.facebook.com/docs/authentication/ (específicamente los bits y te estás protegiendo de CSRF?).

Además, supongo que esto es un error tipográfico en su pregunta, pero no debe ser su regla de reescritura:

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?**webhosting**=$1 [L] 
+0

Hola, mrtom Sí, lo siento, es solo un típico, pensé que sería más fácil de leer cuando lo traduje al inglés :) El ejemplo que estoy usando es https://github.com/facebook/php-sdk/blob/master/examples/ example.php y no hay nada sobre la protección CSRF? esta API de Facebook es extraña con diferentes códigos en todo el lugar. pero funciona correctamente cuando no se usa la url de reescritura mod ... – John

1

trate de cambiar su RewriteRule a

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L,QSA] 

QSA = Anexar cadena de consulta. Esto asegura que no pierdas tus parámetros GET.

7

Gracias bismark.

Has acertado; no se pudo obtener los parámetros GET, y la solución fue la siguiente:

De

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

a

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [QSA,L] 

cadena de consulta de datos anexados [QSA]

•'qsappend|QSA' (query string append) 
This flag forces the rewrite engine to append a query string part of the substitution string 
to the existing string, instead of replacing it. Use this when you want to add more data 
to the query string via a rewrite rule. 

Gracias chicos ¡Ponme en el camino correcto!

+1

Si bismark es correcto, es bueno aceptar la respuesta o, al menos, votar arriba. He votado su pregunta para darle un pequeño representante con el que jugar. – Fionnuala

+0

Hola Remou, tenemos toda la razón, soy un poco nuevo en esta página web, así que no sabía que podía votar o aceptar respuestas :) – John

0

Si alguien sigue recibiendo este error después del archivo .htaccess, le sugiero que cambie el parámetro redirect_uri en el archivo PHP, así como la URL del sitio en la configuración de la aplicación de Facebook.

I resolvieron este error se cambia de

http:domain.com/folder

a

http:domain.com/folder/index.php

-1

me fijo este por (olvido) para que coincida alcance/permisos desde una aplicación a los permisos en la developers.facebook.com/app página ... (es decir, goto configuración de la aplicación, permisos).

+1

Es posible que desee ser un poco más específico. –

0

El 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 un token válido si 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 el mensaje de error no válido

Cuestiones relacionadas