PassportJS自定义验证回调未被调用

fun*_*iki 6 javascript node.js express passport.js

更新:以下错误由提交修复.我已将第一个答案标记为"正确",尽管在其中一条评论中引起了我的注意

我希望利用自定义回调来处理Passport的身份验证本地策略中登录的成功和失败,但看起来它只是在成功时被调用.

这是我正在谈论的片段:

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
    });
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?我的印象是回调会被调用,所以我可以自己处理错误.

rob*_*lep 10

如果要传播身份验证失败(用户名/密码不匹配),则不应生成错误,而是设置userfalse并传递原因:

passport.use(new LocalStrategy(
  {usernameField: 'email', passwordField: 'password'},
  function(email, password, done) {
    if (canLogin)
      done(null, user);
    else 
      done(null, false, { message: 'Invalid login credentials' });
  }
));
...
app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (user === false) {
      // handle login error ...
    } else {
      // handle successful login ...
    }
  })(req, res, next);
});
Run Code Online (Sandbox Code Playgroud)

err被保留,因为如果你得到DB-错误,比如在认证的过程中发生的,比如例外.但是,尽管Passport文档表明这些错误将被传递给passport.authenticate回调,但它们似乎并不存在(这就是为什么它不能为你工作的原因).

  • 如果提供了自定义回调,则现在会将错误传播给它.有关详细信息,请参阅此处:https://github.com/jaredhanson/passport/issues/186 (2认同)