Comment utiliser JTI claim dans un JWT

Le JWT spec mentionne un jti réclamation qui aurait peut être utilisé comme un nonce pour prévenir les attaques de relecture:

la réclamation jti (JWT ID) fournit un identificateur unique pour la JWT. La valeur d'identification doit être assignée d'une manière qui assure qu'il y a une probabilité négligeable que la même valeur sera accidentellement assignée à un objet de données différent; si l'application utilise plusieurs émetteurs, les collisions doivent être évitées parmi les valeurs produites par différents émetteurs ainsi. L'itc peut être utilisée pour empêcher le JWT d'être relus. L'itc valeur est une chaîne sensible à la casse. L'utilisation de cette allégation est facultative.

ma question Est de savoir comment je m'y prendrais pour mettre en oeuvre ceci? Ai-je besoin de stocker les ITC utilisées précédemment et d'émettre un nouveau JWT avec chaque demande? Si c'est le cas, cela ne va-t-il pas à l'encontre de L'objectif des Tjsf? Pourquoi utiliser un JWT au lieu de simplement stocker un ID de session généré au hasard dans une base de données?

mon API REST a une base de données mongo et je ne suis pas contre l'ajout d'une instance redis. Y a-t-il une meilleure option d'authentification que JWT? Je ne veux surtout pas stocker de mots de passe sur le client, ce qui élimine L'authentification HTTP comme option, cependant, comme je m'enfonce dans ce truc JWT, je commence à me sentir comme si une implémentation de token personnalisée ou une norme différente pourrait mieux convenir à mes besoins. Y a-t-il des paquets node/express pour l'authentification basée sur un jeton qui prennent en charge la révocation et la rotation des jeton les jetons?

apprécierait n'importe quel conseil.

34
demandé sur Yves M. 2015-03-07 00:18:23

2 réponses

en effet, le stockage de tous les identifiants JWT délivrés sape le caractère apatride de l'utilisation des JWT. Toutefois, le but de la JWT IDs est de pouvoir révoquer des JWT déjà émises. Pour ce faire, il est plus facile de procéder à une liste noire qu'à une liste blanche. Si vous avez inclus la réclamation "exp" (vous devriez), alors vous pouvez éventuellement nettoyer JWTS liste noire comme ils expirent naturellement. Bien sûr, vous pouvez mettre en œuvre d'autres options de révocation en parallèle (par exemple, révoquer tous les jetons d'un client sur la base d'une combinaison de "iat" et "aud").

30
répondu Gert Hengeveld 2015-04-29 14:26:12

Vous pouvez utiliser le paquet express-jwt

Voir express-jwt sur GitHub ou sur NPM.

Express-jwt poignées révoqué jetons comme décrit ici: https://github.com/auth0/express-jwt#revoked-tokens

var jwt = require('express-jwt');
var data = require('./data');
var utilities = require('./utilities');

var isRevokedCallback = function(req, payload, done){
  var issuer = payload.iss;
  var tokenId = payload.jti;

  data.getRevokedToken(issuer, tokenId, function(err, token){
    if (err) { return done(err); }
    return done(null, !!token);
  });
};

app.get('/protected',
  jwt({secret: shhhhhhared-secret,
    isRevoked: isRevokedCallback}),
  function(req, res) {
    if (!req.user.admin) return res.send(401);
    res.send(200);
  });

vous pouvez aussi lire la partie 4. Comment éviter d'ajouter des frais généraux?c'oauth0 blog.

9
répondu Yves M. 2015-10-08 10:12:46