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.
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
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
"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 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.
À 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.