node.js - home - sistema operativo para node js
Pasaporte+Node.js/Inicio de sesión automático después de agregar el usuario (3)
Estoy usando el pasaporte para la autenticación y el manejo de sesiones. Todo funciona bien hasta ahora. Implementé el formulario "Iniciar sesión" para agregar nuevos usuarios a la aplicación. Después de agregar un usuario, me gustaría iniciar sesión automáticamente.
¿Cuál es la mejor manera de lograr esto? ¿Debo redireccionar a "/ login" con las credenciales de usuario o hay otra / mejor manera (llamar a serializeUser) para hacer eso?
Hasta ahora creo que no entendí realmente cómo funciona la función "hecho" (en serializeUser y LocalStrategy) o qué está haciendo ...
Aquí está mi código:
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
authProvider.findUserById(''users'', id, function (err, user) {
done(err, user);
});
});
passport.use(new LocalStrategy( function(email, password, done) {
authProvider.getUserByEmail(''users'', email, function(error, user){
if(error) { return done(error); }
if (!user) { return done(null, false, { message: ''Unknown user '' + email });}
if (user.password != password) { return done(null, false);}
return done(null, user);
});
}
));
app.post(''/login'',
passport.authenticate(''local'', { failureRedirect: ''/login''}),
function(req, res) { res.redirect(''/'');});
app.post(''/sign'', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
if(error){
res.redirect(''/sign'');
} else {
res.redirect(''/'');
}
});
});
¿Alguien sabe cómo hacer esto?
Utilice el código de la siguiente respuesta de @Weston , porque es más universal y directo
Debería verse algo como esto
app.post(''/sign'', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
if(error){
res.redirect(''/sign'');
} else {
passport.authenticate(''local'')(req, res, function () {
res.redirect(''/account'');
})
}
});
});
No estoy seguro sobre el nombre de la estrategia, pero por defecto, LocalStrategy debería proporcionar el nombre ''local''
Basado en la Guía de pasaportes, req.login()
está diseñado para este propósito exacto.
Esta función se usa principalmente cuando los usuarios se registran, durante los cuales se puede invocar a
req.login()
para iniciar sesión automáticamente en el nuevo usuario registrado.
Modificar el código de krasu:
app.post(''/sign'', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
if ( error ){
res.redirect(''/sign'');
} else {
req.login(user, function (err) {
if ( ! err ){
res.redirect(''/account'');
} else {
//handle error
}
})
}
});
});
El error potencial de la devolución de llamada de login()
provendría de su función serializeUser()
.
Intenta con:
app.post(''/sign'', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
passport.authenticate(''local'', (err, user) => {
req.logIn(user, (errLogIn) => {
if (errLogIn) {
return next(errLogIn);
}
return res.redirect(''/account'');
});
})(req, res, next);
});
});