He creado una aplicación con la pila MERN (Mongo, Express, React y NodeJs). Ahora estoy investigando sobre la construcción de un sistema de autenticación. Hay literalmente montones y montones de tutoriales y videos en los que se construye un sistema en el que el usuario se autentica durante un máximo de, digamos, 24 horas y luego tiene que volver a iniciar sesión. Todos usan jwt o session con algo como express-session . Sin embargo , estoy usando ciertos sitios web en los que básicamente nunca estoy desconectado.
Realmente me gustaría crear un sistema yo mismo en el que el usuario esté autenticado durante al menos 14 a 30 días sin que se le solicite volver a iniciar sesión (idealmente, incluso más tiempo). No puedo encontrar buenos recursos en línea sobre cómo persistir el inicio de sesión del usuario durante largos períodos de tiempo. Soy consciente de que existen importantes compensaciones de seguridad involucradas en la creación de un sistema de este tipo. También soy consciente de que puedo establecer el tiempo de caducidad de un jwt o el maxAge de una cookie de sesión entre 14 y 30 días, pero parece una muy mala idea. Sin embargo, realmente me gustaría aprender y leer más sobre estos métodos de autenticación con inicio de sesión persistente durante largos períodos de tiempo.
¿Alguien podría proporcionar algunos buenos recursos / ideas sobre este tema en particular? ¿Cuáles son algunas cosas que debo tener en cuenta?
Para sesiones de tiempo prolongado, el uso de jwt sin estado puede no ser la mejor idea.
Como requisito crítico serían las invalidaciones de sesión, la detección de robo de tokens, que jwt por sí solo no puede proporcionar. Necesita algunos componentes inteligentes circundantes para toda la configuración.
Los tokens JWT sin estado no se pueden invalidar ni actualizar, e introducirán problemas de tamaño o de seguridad según dónde los almacene. Los tokens Stateful JWT funcionan igual que las cookies de sesión, pero sin las implementaciones probadas y bien revisadas ni la asistencia al cliente.
A menos que trabaje en una aplicación a escala de Reddit, no hay razón para usar tokens JWT como mecanismo de sesión. Solo usa sesiones.
http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
En general, debido a que la seguridad es difícil de implementar correctamente, se recomienda usar un proveedor de OAuth de terceros o al menos una biblioteca bien probada para la autenticación y autorización locales.
Si desea construir su propio sistema, puede implementar un sistema con dos tokens. Un token de autorización y un token de actualización. Establezca la caducidad del token de autenticación en algo corto como una hora y el token de actualización durante el tiempo que desee.
Pase el token de autenticación en todas las solicitudes y valídelo en el back-end. Cuando el token de autenticación caduca, el servidor devuelve un mensaje de token no válido y el cliente debe solicitar un nuevo token de autenticación que pase el token de actualización. El servidor valida el token de actualización y emite un nuevo token de autenticación y actualización para el cliente. Este proceso se repite hasta que caduca el token de actualización.
Si ambos tokens caducan, el usuario debe volver a autenticarse. Cuando un usuario cierra la sesión, debe caducar/eliminar los tokens de autenticación y actualización tanto en el cliente como en el servidor.
Este sistema minimiza la exposición de un token de autenticación capturado al tiempo que permite el acceso del cliente durante períodos de tiempo más prolongados.
Esta es solo una versión aproximada y simplificada de cómo podría funcionar un sistema de este tipo. Deberá idear alguna forma de validar los tokens y realizar un seguimiento de qué tokens pertenecen a qué usuarios.