example - Express Passport(node.js) error manejo
passport js tutorial (3)
He visto cómo debería funcionar el manejo de errores en el nodo a través de este intercambio de pila , pero no estoy seguro de qué pasa cuando falla la autenticación. Tengo la siguiente LocalStrategy:
passport.use(new LocalStrategy({ usernameField: ''email'', passwordField: ''password'' },
function(email, password, next) {
User.find({email: UemOrUnm}, function(err, user){
if (err) { console.log(''Error > some err''); return next(err); }
if (!user) { console.log(''Error > no user''); return next(''Incorrect login or password''); }
if (password != user.password) {
return next(Incorrect login or password);
}
return next(null, user);
});
}
));
Después de ver la impresión de la consola ''Error> algunos err'', no ocurre nada más. Creo que debería continuar en la próxima ruta con un parámetro de error, pero no parece hacer eso. ¿Que esta pasando?
La implementación de la estrategia funciona junto con passport.authenticate
para autenticar una solicitud y manejar el éxito / falla.
Digamos que está utilizando esta ruta (a la que se le pasa una dirección de correo electrónico y una contraseña):
app.post(''/login'', passport.authenticate(''local'', {
successRedirect: ''/loggedin'',
failureRedirect: ''/login'', // see text
failureFlash: true // optional, see text as well
});
Esto llamará al código en la estrategia, donde puede ocurrir una de estas tres condiciones:
- Se produjo un error interno al tratar de obtener la información de los usuarios (digamos que la conexión de la base de datos se ha ido); este error se transmitirá:
next(err)
; esto será manejado por Express y generará una respuesta HTTP 500; - Las credenciales proporcionadas no son válidas (no hay ningún usuario con la dirección de correo electrónico suministrada, o la contraseña no coincide); en ese caso, no genera un error, pero pasa un
false
como el objeto de usuario:next(null, false)
; esto activará elfailureRedirect
(si no define uno, se generará una respuesta HTTP 401 no autorizada); - Todo sale, tienes un objeto de usuario válido, así que lo pasas:
next(null, user)
; esto activará elsuccessRedirect
;
En el caso de una autenticación no válida (pero no un error interno), puede pasar un mensaje adicional junto con la devolución de llamada:
next(null, false, { message : ''invalid e-mail address or password'' });
Si ha utilizado failureFlash
e instalado el middleware connect-flash , el mensaje proporcionado se almacena en la sesión y se puede acceder fácilmente a, por ejemplo, para utilizarlo en una plantilla.
EDITAR: también es posible manejar por completo el resultado del proceso de autenticación (en lugar de que Passport envíe una redirección o 401):
app.post(''/login'', function(req, res, next) {
passport.authenticate(''local'', function(err, user, info) {
if (err) {
return next(err); // will generate a 500 error
}
// Generate a JSON response reflecting authentication status
if (! user) {
return res.send({ success : false, message : ''authentication failed'' });
}
// ***********************************************************************
// "Note that when using a custom callback, it becomes the application''s
// responsibility to establish a session (by calling req.login()) and send
// a response."
// Source: http://passportjs.org/docs
// ***********************************************************************
req.login(user, loginErr => {
if (loginErr) {
return next(loginErr);
}
return res.send({ success : true, message : ''authentication succeeded'' });
});
})(req, res, next);
});
Lo que Christian estaba diciendo es que necesitas agregar la función
req.login(user, function(err){
if(err){
return next(err);
}
return res.send({success:true});
});
Entonces, toda la ruta sería:
app.post(''/login'', function(req, res, next) {
passport.authenticate(''local'', function(err, user, info) {
if (err) {
return next(err); // will generate a 500 error
}
// Generate a JSON response reflecting authentication status
if (! user) {
return res.send(401,{ success : false, message : ''authentication failed'' });
}
req.login(user, function(err){
if(err){
return next(err);
}
return res.send({ success : true, message : ''authentication succeeded'' });
});
})(req, res, next);
});
Necesita agregar req.logIn(function (err) { });
y hacer el éxito redirigir dentro de la función de devolución de llamada