/ / passport.js - Mensagem de falha de acesso após o erro 401 - jquery, node.js, express, passport.js, http-status-code-401

passport.js - Mensagem de falha de acesso após o erro 401 - jquery, node.js, express, passport.js, http-status-code-401

Atualmente, posso acessar mensagens definidas em done(null, user, {message: "ok"}) dentro do pedido de postagem via req.authInfocomo isso:

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

O que é muito útil
Mas como posso acessar mensagens assim done(null, false, {message: "username taken"}) da mesma forma, como parece que passando done(null, false) no passport.authenticate faz com que ele lance 401 não autorizado, portanto, não encaminhando para o manipulador de rota em si.
Talvez eu tenha entendido errado alguma coisa?

P.S .: eu estou postando por jQuery.post.

Respostas:

5 para resposta № 1

Você deveria usar callback personalizado onde você tem info acessível:

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 fica definido somente após o login bem-sucedido. Se você estivesse usando sessões, você poderia usar mensagens flash com redirecionamentos, por exemplo:

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

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

1 para resposta № 2

Todo mundo tem seu próprio jeito de implementá-lo. Na minha implementação, se não houver erros e o login for bem sucedido, então:

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

Considerando que, se qualquer erro ou login sem sucesso, então eu faço

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

ou

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

Então isso torna meu trabalho mais simples, eu só type valor e eu posso usá-lo para passar valores, bem como mensagens de erro.