/ / passport.js - Съобщение за неуспешно достъп след грешка 401 - jquery, node.js, express, passport.js, http-status-code-401

passport.js - Съобщение за отказ при достъп след грешка 401 - jquery, node.js, express, passport.js, http-status-code-401

Понастоящем имам достъп до съобщенията, зададени в done(null, user, {message: "ok"}) вътре в заявката по пощата req.authInfoкато този:

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

Което е много полезно.
Но как мога да получа достъп до това съобщение done(null, false, {message: "username taken"}) по същия начин, както изглежда, че минава done(null, false) в passport.authenticate го прави хвърля 401 неоторизиран, следователно не препраща към самия маршрутизатор.
Може би не съм разбрал нещо?

П.С .: Ще прекосявам jQuery.post.

Отговори:

5 за отговор № 1

Трябва да използвате custom callback където имаш info достъпни:

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 се настройва само след успешно влизане. Ако сте използвали сесии, можете да използвате флаш съобщения с пренасочване, например:

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

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

1 за отговор № 2

Всеки има свой собствен начин да го приложи. В моето изпълнение, ако няма грешки и входът е успешен след това:

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

Като има предвид, че ако има някаква грешка или неуспешно влизане, тогава аз правя и двете

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

или

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

Така че това прави работата ми по-проста, само проверявам type стойност и мога да го използвам, за да предавам стойности, както и съобщения за грешки.