更新:以下错误由
a commit修复.我已将第一个答案标记为“正确”,尽管在其中一条评论中引起了我的注意
我希望利用自定义回调来处理Passport authenticate local strategy中登录的成功和失败,但它看起来只是在成功时调用.
这是我正在谈论的片段:
passport.use(new LocalStrategy( {usernameField: 'email',passwordField: 'password'},function(email,password,done) { if(canLogin) done(null,user); else done({message: "This is an error message" },false,{ message: "Some Info" }); } )); app.post('/login',function(req,res,next) { passport.authenticate('local',function(err,user,info) { // Only called if err is not set });
解决方法
如果要传播身份验证失败(用户名/密码不匹配),则不应生成错误,而应将用户设置为false并传递原因:
passport.use(new LocalStrategy( {usernameField: 'email',done) { if (canLogin) done(null,user); else done(null,{ message: 'Invalid login credentials' }); } )); ... app.post('/login',next) { passport.authenticate('local',info) { if (user === false) { // handle login error ... } else { // handle successful login ... } })(req,next); });
错误保留用于在身份验证过程中发生的异常,例如,如果出现DB错误等.但是,尽管Passport文档表明这些错误将传递给passport.authenticate回调,但它们似乎并不存在(这就是为什么它不能为你工作的原因).