web-dev-qa-db-fra.com

Comment détruire les jetons JWT lors de la déconnexion?

J'utilise le plugin jwt et la stratégie dans hapijs. Je suis capable de créer un jeton jwt lors de la connexion d'un utilisateur et d'authentifier une autre API en utilisant le même jeton via la stratégie 'jwt'. Je configure le jeton dans 'request.state.USER_SESSION' en tant que cookie où USER_SESSION est le nom du jeton. De plus, je ne sauvegarde pas ces jetons dans la base de données. Mais comment puis-je détruire le jeton JWT au moment de la déconnexion? S'il vous plaît suggérer un moyen.

36
Garima

Le JWT étant stocké dans le navigateur, supprimez le jeton en supprimant le cookie côté client.

Si vous devez également invalider le jeton côté serveur avant son heure d'expiration, par exemple, compte supprimé/bloqué/suspendu, mot de passe modifié, autorisations modifiées, utilisateur déconnecté par administrateur, consultez Invalidation des jetons Web JSON pour certaines techniques communes telles que la création d'une liste noire ou la rotation de jetons

49
pedrofb

Vous ne pouvez pas expirer manuellement un jeton après sa création. Ainsi, vous ne pouvez pas vous déconnecter avec JWT côté serveur comme vous le faites avec des sessions.

JWT est sans état, ce qui signifie que vous devez stocker tout ce dont vous avez besoin dans la charge utile et ignorer l'exécution d'une requête de base de données à chaque requête. Toutefois, si vous envisagez une fonctionnalité de déconnexion stricte qui ne peut pas attendre l'expiration automatique du jeton, même si vous avez nettoyé le jeton côté client, vous devrez peut-être négliger la logique sans état et effectuer certaines requêtes. alors quelle est une solution?

  • Définir un délai d'expiration raisonnable sur les jetons

  • Supprimer le jeton stocké du côté client lors de la déconnexion

  • Requête fournie jeton contre La liste noire sur chaque demande autorisée

La liste noire

"Liste noire" de tous les jetons qui ne sont plus valides et qui n'ont pas encore expiré. Vous pouvez utiliser une base de données avec l'option TTL sur les documents qui serait définie sur le temps qu'il reste avant l'expiration du jeton.

Redis

Redis est une bonne option pour blackblist, cela permettra un accès rapide en mémoire à la liste. Ensuite, dans un middleware quelconque qui s'exécute sur chaque requête autorisée, vous devez vérifier si le jeton fourni est dans le liste noire. Si c'est le cas, vous devriez générer une erreur non autorisée. Et si ce n'est pas le cas, laissez-le aller et la vérification JWT le gérera et déterminera s'il est expiré ou toujours actif.

13
Jamil Noyda

À la déconnexion du côté client , le moyen le plus simple consiste à supprimer le jeton de la mémoire du navigateur.

Mais que se passe-t-il si vous souhaitez détruire le jeton sur le Node serveur -

Le problème avec le package JWT est qu’il ne fournit aucune méthode ni aucun moyen de détruire le jeton.

Donc, pour détruire le jeton sur le serveur, vous pouvez utiliser le paquet jwt-redis au lieu de JWT

Cette bibliothèque (jwt-redis) répète complètement toute la fonctionnalité de la bibliothèque jsonwebtoken, avec un ajout important. Jwt-redis vous permet de stocker le label de jeton dans redis pour vérifier sa validité. L'absence d'étiquette de jeton dans redis rend le jeton non valide. Pour détruire le jeton dans jwt-redis, il existe une méthode de destruction

cela fonctionne de cette façon:

1) Installez jwt-redis à partir de npm

2) créer -

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) À vérifier -

jwtr.verify(token, secret);

4) à détruire -

jwtr.destroy(token)

Remarque : vous pouvez fournir expiresIn lors de la connexion du jeton de la même manière que dans JWT.

0
Aman Kumar Gupta