【问题标题】:Granular error handling in Passport authenticatePassport 身份验证中的细粒度错误处理
【发布时间】:2015-01-08 02:05:27
【问题描述】:

我正在对 REST 调用中的用户进行身份验证,并按照文档中的说明实现自定义回调。

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    //.. do something with user here and send a response
  })(req, res, next); 
});

现在,如果策略中的某些验证失败,我想传递一个错误。

passport.use(new BasicStrategy(
function(email, password, callback) {

User.findOne({
  email: email
}, function(err, user) {
  if (err) {
    return callback(err);
  }

  if (!user) {
    return callback(new Error('User unknown'), false);
  }

  // Make sure the password is correct
  user.verifyPassword(password, function(err, isMatch) {
    if (err) {
      return callback(err);
    }

    // Password did not match
    if (!isMatch) {
      return callback(new Error('Password mismatch'), false);
    }

    // Success
    return callback(null, user);
  });
});

}

但错误从未传递给authenticate中的回调:

function(err, user, info) {
     // err is always null
}

如何传递错误,以便向用户提供更详细的反馈?

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

    我发现您的代码有两个问题。第一个是您在注册 BasicStrategy 时请求“本地”身份验证策略。为此,您应该将 'local' 替换为 'basic'。

    第二个是,如果你想使用BasicStrategy,你必须使用HTTP协议支持的Base Authentication,否则BasicStrategy的回调将不会被调用,你的身份验证回调将运行err == null和用户 == 假。

    我用 Postman 对此进行了测试,只有在我发送了 Basic Auth 信息之后,BasicStrategy 回调才运行。

    我希望这会有所帮助。

    【讨论】: