node.js - simple - Cómo usar jti claim en un JWT
jwt java (2)
Puede usar el paquete express-jwt
Ver express-jwt en GitHub o en NPM .
Express-jwt maneja tokens revocados como se describe aquí: 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);
});
También puede leer la parte 4. ¿Cómo evitamos agregar gastos generales? de esta oauth0 publicación de blog .
La especificación JWT menciona una afirmación de jti que supuestamente se puede utilizar como un nonce para evitar ataques de repetición:
El reclamo jti (JWT ID) proporciona un identificador único para el JWT. El valor del identificador DEBE asignarse de una manera que asegure que existe una probabilidad insignificante de que el mismo valor se asigne accidentalmente a un objeto de datos diferente; si la aplicación usa múltiples emisores, las colisiones DEBEN prevenirse también entre los valores producidos por diferentes emisores. La declaración jti se puede usar para evitar que el JWT se reproduzca. El valor de jti es una cadena sensible a mayúsculas y minúsculas. El uso de este reclamo es OPCIONAL.
Mi pregunta es ¿cómo voy a implementar esto? ¿Debo guardar los jtis previamente utilizados y emitir un nuevo JWT con cada solicitud? Si es así, ¿esto no derrota el propósito de los JWT? ¿Por qué utilizar un JWT en lugar de simplemente almacenar un ID de sesión generado aleatoriamente en una base de datos?
Mi API REST tiene una base de datos mongo y no estoy en contra de agregar una instancia redis. ¿Hay una mejor opción de autenticación que JWT? Principalmente no quiero almacenar contraseñas en el cliente, lo que elimina la autenticación HTTP como una opción, sin embargo, a medida que profundizo en estas cosas de JWT, empiezo a sentir que una implementación de token personalizada o un estándar diferente podría ser mejor. se adapta a mis necesidades ¿Hay algún paquete nodo / expreso para autenticación basada en token que admita la revocación de token y los tokens rotativos?
Agradecería cualquier consejo.
De hecho, almacenar todas las ID de JWT emitidas socava la naturaleza apátrida del uso de JWT. Sin embargo, el propósito de los ID JWT es poder revocar los JWT emitidos previamente. Esto puede lograrse más fácilmente mediante listas negras en lugar de listas blancas. Si ha incluido el reclamo de "exp" (debería), puede eventualmente limpiar los JWT incluidos en la lista negra a medida que caducan de forma natural. Por supuesto, puede implementar otras opciones de revocación al mismo tiempo (por ejemplo, revocar todas las fichas de un cliente en función de una combinación de "iat" y "aud").