Saltar al contenido

¿Cómo destruir tokens JWT al cerrar la sesión?

Te recomendamos que revises esta solución en un ambiente controlado antes de pasarlo a producción, saludos.

Solución:

El JWT se almacena en el navegador, así que elimine el token eliminando la cookie en el lado del cliente

Si también necesita invalidar el token del lado del servidor antes de su fecha de caducidad, por ejemplo, cuenta eliminada/bloqueada/suspendida, cambio de contraseña, cambio de permisos, cierre de sesión del usuario por parte del administrador, eche un vistazo a Invalidación de tokens web JSON para conocer algunas técnicas comunes como creando una lista negra o fichas rotativas

No puede caducar manualmente un token después de que se haya creado. Por lo tanto, no puede cerrar sesión con JWT en el lado del servidor como lo hace con las sesiones.

JWT no tiene estado, lo que significa que debe almacenar todo lo que necesita en la carga útil y omitir la realización de una consulta de base de datos en cada solicitud. Pero si planea tener una funcionalidad estricta de cierre de sesión, que no puede esperar a que el token caduque automáticamente, incluso si ha limpiado el token del lado del cliente, es posible que deba ignorar la lógica sin estado y hacer algunas consultas. Entonces, ¿cuál es una solución?

  • Establece un tiempo de caducidad razonable para los tokens

  • Elimine el token almacenado del lado del cliente al cerrar la sesión

  • Consulta de token proporcionado contra La lista negra en cada solicitud autorizada

Lista negra

“Lista negra” de todos los tokens que ya no son válidos y aún no han caducado. Puede usar una base de datos que tenga una opción TTL en documentos que se establecerían en la cantidad de tiempo restante hasta que caduque el token.

redis

Redis es una buena opción para lista negra, que permitirá un rápido acceso en memoria a la lista. Luego, en el middleware de algún tipo que se ejecuta en cada solicitud autorizada, debe verificar si el token proporcionado está en The Lista negra. Si es así, debe arrojar un error no autorizado. Y si no es así, déjalo ir y la verificación de JWT lo manejará e identificará si está caducado o sigue activo.

Para obtener más información, consulte Cómo cerrar sesión al usar JWT. por Arpy Vanyan

Al cerrar sesión desde el lado del clientela forma más fácil es eliminar el token del almacenamiento del navegador.

Pero, ¿qué sucede si desea destruir el token en el servidor Node?

El problema con el paquete JWT es que no proporciona ningún método o forma de destruir el token.

Entonces, para destruir el token en el lado del servidor, puede usar paquete jwt-redis en lugar de JWT

Esta biblioteca (jwt-redis) repite por completo toda la funcionalidad de la biblioteca jsonwebtoken, con una adición importante. Jwt-redis le permite almacenar la etiqueta del token en redis para verificar la validez. La ausencia de una etiqueta de token en redis hace que el token no sea válido. Para destruir el token en jwt-redis, hay un método de destrucción

funciona de esta manera:

1) Instalar jwt-redis desde npm

2) Crear –

var redis = require('redis');
var JWTR =  require('jwt-redis').default;
var redisClient = redis.createClient();
var jwtr = new JWTR(redisClient);

jwtr.sign(payload, secret)
    .then((token)=>
            // your code
    )
    .catch((error)=>
            // error handling
    );

3) Para verificar

jwtr.verify(token, secret);

4) Para destruir

jwtr.destroy(token)

Nota : puede proporcionar expiresIn durante el inicio de sesión del token de la misma manera que se proporciona en JWT.

Si crees que ha sido de ayuda este post, sería de mucha ayuda si lo compartieras con más programadores y nos ayudes a difundir esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *