Javascript 如何使用passport local登录用户并显示错误消息?
因此,我一直在尝试在我的VueJs应用程序上使用Javascript 如何使用passport local登录用户并显示错误消息?,javascript,node.js,authentication,passport.js,passport-local,Javascript,Node.js,Authentication,Passport.js,Passport Local,因此,我一直在尝试在我的VueJs应用程序上使用PassportJs编写身份验证系统。我编写了一个函数来初始化PassportJs的基本功能,如下所示: module.exports = { passport: function () { authenticateUser = async (email, password, done) => { User.findOne({ email: email }, async (err, user) => {
PassportJs
编写身份验证系统。我编写了一个函数来初始化PassportJs
的基本功能,如下所示:
module.exports = {
passport: function () {
authenticateUser = async (email, password, done) => {
User.findOne({ email: email }, async (err, user) => {
if (user == null) return done(null, false, { msg: 'No user registered with this email' })
try {
if (await bcrypt.compare(password, user.password)) {
return done(null, user)
} else {
return done(null, false, { msg: "Password incorrect" })
}
} catch (e) {
return done(e)
}
})
}
passport.use(new LocalStrategy({ usernameField: 'email', }, authenticateUser));
passport.serializeUser((user, done) => {
console.log('passport serializeUser')
done(null, user.id)
})
passport.deserializeUser((id, done) => {
console.log('passport deserializeUser')
User.findById(id, (err, user) => {
done(err, user)
})
})
},
};
现在,我只需要在前端显示正确的错误消息
此代码用于显示错误消息,但不适用于实际登录用户:
router.post('/login', function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
if (err) { return next(err); }
if (!user) {
console.log('mand?????: ', info)
res.status(401).json({ msg: info.msg });
return;
}
})(req, res, next);
});
我可以看到此代码运行(等待bcrypt.compare(password,user.password))
,但它不会序列化用户。请求只是保持“挂起”,但未完成
此代码用于实际登录用户,但不用于显示错误消息:
router.post('/login', passport.authenticate('local'))
我哪里做错了?如何成功登录用户,同时显示passportjs的
done()
函数中声明的正确错误消息?请查看passport
文档中的authenticate()
方法
使用自定义回调时,它将成为应用程序的
负责建立会话(通过呼叫)和
发送响应
因此,在第一个场景中,您需要明确地建立会话—passport不会自动为您建立会话
关于不使用自定义回调的第二个场景:
默认情况下,如果身份验证失败,Passport将以401响应
未经授权的状态,任何其他路由处理程序都不会被删除
调用
据我所知,通过此设置,作为策略的一部分设置的闪存消息
验证回调不会被使用-除非指定了重定向
选项,您不希望在此处使用这些选项
因此,您可能应该使用第一个场景,以便能够使用策略
验证回调闪存消息来定制错误响应。只要确保登录成功后建立会话即可
编辑:我刚刚通过了一个快速测试,另外,您也可以通过将策略
验证回调返回错误,将error.message
属性设置为要作为响应发送的任何错误消息,而不需要自定义回调和闪存消息。请注意,在这种情况下,passport实际上将错误消息的响应正文设置为文本
因此,例如,而不是:
done(null, false, { msg: 'No user registered with this email' })
你会做:
done(new Error('No user registered with this email')
谢谢你的详细解释!我应该更彻底地阅读文档。最后我完成了
(新的错误('No user registed with this email')
。这似乎是一个很好的解决方法:)。谢谢!