Aunque definitivamente me gustaría ver estas características en passport.js, todavía no están allí.
He creado un generador de símbolos aleatoria simple de usar con la función() serilizeUser passport.js, y modificado la respuesta de Justen sólo un poco para satisfacer mis necesidades. Básicamente, la única diferencia es que si la opción "recordar" no está configurada, la sesión durará mientras el navegador esté abierto.
Esta es mi serializador con el acceso aleatorio generador de símbolos. Estoy usando Mongodb y Mongoose, pero la implementación debería traducirse bastante bien en otros sistemas.
Básicamente, estoy consiguiendo el tiempo y añadiendo una cadena de 16 caracteres al azar a ella. Luego, en la función serializeUser(), verifico que ningún otro usuario tiene el mismo token (¡el token debe ser único!).
User.methods.generateRandomToken = function() {
var user = this,
chars = "_!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
token = new Date().getTime() + '_';
for (var x = 0; x < 16; x++) {
var i = Math.floor(Math.random() * 62);
token += chars.charAt(i);
}
return token;
};
Aquí está el serializador:
passport.serializeUser(function (user, done) {
var createAccessToken = function() {
var token = user.generateRandomToken();
app.User.findOne({ accessToken: token }, function (err, existingUser) {
if (err) return done(err);
if (existingUser)
createAccessToken(); // Run the function again - the token has to be unique!
else {
user.set('accessToken', token);
user.save(function (err) {
if (err) return done(err);
return done(null, user.get('accessToken'));
})
}
});
};
if (user._id) {
createAccessToken();
}
});
... y aquí está mi versión del middleware que se encarga de la funcionalidad "recuérdame". Preferiría que esto de alguna manera sea parte de la función serializeUser o passport.js core.
app.use(express.session({ secret: 'secret_key' }));
app.use(function (req, res, next) {
if (req.method == 'POST' && req.url == '/login') {
if (req.body.remember) {
req.session.cookie.maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days
} else {
req.session.cookie.expires = false;
}
}
next();
});
app.use(passport.initialize());
app.use(passport.session());
Espero que ayude de alguna manera. Me tomó un par de horas para resolverlo y no estoy muy seguro de que este es el mejor forma de hacerlo, pero me funciona, por ahora.
supongo que no es tan difícil de poner en práctica, sólo desearía que ya existía. –
He creado una estrategia de "recuérdame": https://github.com/jaredhanson/passport-remember-me –