/ / passport.js - Mensaje de error de acceso después del error 401 - jquery, node.js, express, passport.js, http-status-code-401

pasaporte.js - Mensaje de error de acceso después del error 401 - jquery, node.js, express, passport.js, http-status-code-401

Actualmente puedo acceder a los mensajes establecidos en done(null, user, {message: "ok"}) dentro de la solicitud de post vía req.authInfoMe gusta esto:

app.post("/reg", passport.authenticate("local-reg", { session: false }), function (req, res) {
console.log(req.authInfo.message); --> "ok"
});

Lo cual es muy útil.
¿Pero cómo puedo acceder a un mensaje como este? done(null, false, {message: "username taken"}) de la misma manera, ya que parece que pasa done(null, false) en pasaporte.authenticate hace que arroje 401 sin autentificar, por lo tanto, no reenvía al manejador de ruta.
¿Tal vez malentendí algo?

P.S .: Estoy publicando a través de jQuery.post.

Respuestas

5 para la respuesta № 1

Deberías usar devolución de llamada personalizada donde tienes info accesible:

app.post("/req", function(req, res, next) {
passport.authenticate("local-reg", {session: false}, function(err, user, info) {
if (err) {
return next(err);
}
if (!user) {
return res.json(info);
}
req.logIn(user, function(err) {
if (err) {
return next(err);
}
return res.json(info);
});
})(req, res, next);
});

req.authInfo se establece solo después del inicio de sesión exitoso. Si utilizara sesiones, podría usar mensajes flash con redirecciones, por ejemplo:

app.post("/reg", passport.authenticate("local-reg", {
successRedirect: "/",
failureRedirect: "/",
failureFlash: true,
successFlash: true
}));

app.get("/", function(req, res) {
res.json(req.flash());
});

1 para la respuesta № 2

Todos tienen su propia forma de implementarlo. En mi implementación, si no hay errores y el inicio de sesión es exitoso, entonces:

return done(null, {type : true, data: {email: <some email>, role : <some role>, name: <some name>}, token : <some token>});

Mientras que si hay un error o un inicio de sesión fallido, entonces hago cualquiera

return done(null, {type : false, data: "Email is already taken."});

o

return done(null,{type:false, data: err})

Esto simplifica mi trabajo, solo controlo type valor y puedo usarlo para pasar valores y mensajes de error.