Para un nuevo proyecto node.js en el que estoy trabajando, estoy pensando en cambiar de un enfoque de sesión basado en cookies (con esto, quiero decir, almacenar una identificación en un almacén de valores clave que contiene sesiones de usuario en el navegador de un usuario) a un enfoque de sesión basado en token (sin almacén de valores clave) utilizando JSON Web Tokens (jwt).
El proyecto es un juego que utiliza socket.io: tener una sesión basada en token sería útil en un escenario en el que habrá múltiples canales de comunicación en una sola sesión (web y socket.io)
¿Cómo se podría proporcionar una invalidación de token / sesión desde el servidor utilizando el enfoque jwt?
También quería entender qué trampas / ataques comunes (o poco comunes) debería tener en cuenta con este tipo de paradigma. Por ejemplo, si este paradigma es vulnerable a los mismos / diferentes tipos de ataques que la tienda de sesión / enfoque basado en cookies.
Entonces, digamos que tengo lo siguiente (adaptado de esto y de esto ):
Inicio de sesión en la tienda de sesión:
app.get('/login', function(request, response) {
var user = {username: request.body.username, password: request.body.password };
// Validate somehow
validate(user, function(isValid, profile) {
// Create session token
var token= createSessionToken();
// Add to a key-value database
KeyValueStore.add({token: {userid: profile.id, expiresInMinutes: 60}});
// The client should save this session token in a cookie
response.json({sessionToken: token});
});
}
Inicio de sesión basado en token:
var jwt = require('jsonwebtoken');
app.get('/login', function(request, response) {
var user = {username: request.body.username, password: request.body.password };
// Validate somehow
validate(user, function(isValid, profile) {
var token = jwt.sign(profile, 'My Super Secret', {expiresInMinutes: 60});
response.json({token: token});
});
}
-
Un cierre de sesión (o invalidar) para el enfoque de Almacén de sesión requeriría una actualización de la base de datos KeyValueStore con el token especificado.
Parece que dicho mecanismo no existiría en el enfoque basado en tokens ya que el token en sí contendría la información que normalmente existiría en el almacén de valores clave.
isRevoked
opción o intentar replicar la misma funcionalidad. github.com/auth0/express-jwt#revoked-tokens