2012-05-04 15 views
6

En nuestra aplicación Rails, es común que los usuarios mantengan múltiples pestañas del navegador abiertas durante horas o días a la vez. El problema ocurre cuando, en una de estas pestañas, el usuario cierra la sesión y luego inicia sesión nuevamente (o la sesión expira y se crea una nueva sesión).Cómo manipular páginas con tokens de autenticidad CSRF antiguos en Rails

Esto hace que los tokens de autenticidad CSRF en todas las demás pestañas se vuelvan inválidos. Si intentan enviar cualquier formulario o realizar alguna solicitud ajax en esas pestañas sin actualizar, obtendrán un error (y de hecho se cerrarán la sesión porque ese es el comportamiento predeterminado de Rails cuando se pasa un token de autenticidad incorrecto).

Este comportamiento es claramente indeseable. Me preguntaba qué hacen las personas para manejar con gracia situaciones en las que un usuario tiene una ventana abierta para su sitio, pero el token de autenticidad está desactualizado.

Lo que no quiero hacer es simplemente redirigirlos a la página de inicio de sesión, porque pueden perder su trabajo, por ejemplo, si han estado escribiendo una publicación de blog larga o algo así.

La solución que viene a la mente es tener algún javascript que sondee el servidor para verificar si el token de autenticidad ha cambiado, o sondea las cookies del usuario para verificar si la sesión ha cambiado. Nunca había escuchado que alguien hiciera ninguna de estas cosas, así que quería ver qué pensaba la comunidad.

Respuesta

3

Primero de: inicio de sesión/salida/entrada no dará lugar a la aparición de una nueva csrf-token. Aún se guardará en la cookie del usuario. La próxima vez que inicie sesión a través del mismo navegador recibirá el mismo token.

En las últimas versiones de Rails, no se producirán errores en el caso de un token incorrecto: todos los Rails lo hacen: simplemente reinicia la sesión antes de pasarla a un controlador.

Actualice sus Rails y obtendrá un dolor menos.

+0

Tiene razón, el inicio/cierre de sesión no está causando una nueva generación de token csrf. Parece que está de vuelta en el tablero de dibujo para descubrir de dónde vienen estos errores de tokens no válidos. – Jacob

3

¿Estás seguro de que hablas de token CSRF y token de sesión? No tiene ningún sentido redireccionar para iniciar sesión en un error de coincidencia de CSRF. Simplemente dile al usuario que repita lo que intentó hacer. (En una aplicación web tradicional, esto generalmente aparece cuando se envía un formulario, puede tratar el desajuste CSRF como un error de validación, y mostrar el formulario de nuevo, manteniendo todos los valores de campo, y pedir al usuario que vuelva a enviar. En un AJAX más -pesada aplicación puede utilizar algún tipo de indicador CSRF genérico en la respuesta, y si está configurado, pedir al usuario que haga lo que hizo (presione el botón, etc.) una vez más, o incluso automatizar todo sin molestar al usuario.

+0

¿Puede explicar cómo puede tratar el csrf? desajuste como un error de validación? ¿Hay una forma Rails-y para hacer esto en general? – Jacob

+0

No estoy muy familiarizado con Rails, pero [esto] (https://github.com/bartt/enhanced_req uest_forgery_protection/blob/master/lib/enhanced_request_forgery_protection.rb # L64) parece ser una forma de hacerlo. – Tgr

Cuestiones relacionadas