我正在通过Express使用Passport.js
这是策略:
passport.use(
new Strategy(async function(username, password, done) {
try {
var user = await db.findOne("users", { username: username });
if (!user) {
console.log(`Incorrect username`.red);
return done(null, false, { message: "Incorrect username" });
}
} catch (error) {
return done(error);
}
if (username !== user.username) {
return done(null, false, { message: "Icorrect user!" });
}
if (password !== user.password) {
// console.log("Incorrect Password");
return done(null, false, { message: "Icorrect password!" });
}
return done(null, user, { message: "user lorem ipsum" });
})
);
登录后请求身份验证已执行:
app.post(
"/Login",
// checkCred,
passport.authenticate("local", {
failureFlash: true,
successFlash: true
}),
// The following function is only invoked if authentication succeeded
(req, res) => {
console.log(`Called`.red);
console.log(`CAAALEEEEE`.green);
res.send(
JSON.stringify({
status: "ok",
message: "OK",
redirect: "/User",
user: req.user ? req.user : "user not found in request"
})
);
// res.redirect("/User");
}
);
如果未通过身份验证,则永远不会调用第二个(req, res) => {
函数。
如何使护照调用next()函数,以便我可以将响应返回给用户?
答案 0 :(得分:0)
默认情况下,passport.authenticate()
返回401 Unauthorized(登录失败)或继续使用填充了req.user
的下一个中间件。您可以通过以下两种方式覆盖默认行为:
successRedirect
的{{1}}或failureRedirect
选项authenticate()
提供自定义回调,您可以在其中进行任何重定向并手动调用authenticate()
在您的情况下,我将完全删除(req,next)处理程序,并像这样使用req.logIn()
和successRedirect
failureRedirect
请记住添加所需的软件包以显示Flash消息。