javascript - 未调用 PassportJS 自定义身份验证回调

标签 javascript node.js express passport.js

更新:以下错误已由 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
    });

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

最佳答案

如果你想传播身份验证失败(用户名/密码不匹配),你不应该生成错误,而是将 user 设置为 false 并传递原因沿着:

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);
});

err 保留用于身份验证过程中发生的异常,例如,如果您遇到数据库错误等。但是,尽管 Passport 文档建议将这些错误传递给 passport.authenticate 回调,但它们似乎并没有传递(这就是它对您不起作用的原因)。

关于javascript - 未调用 PassportJS 自定义身份验证回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20206583/

相关文章:

javascript - 下载 html 页面并绑定(bind)到 var

node.js - 如何在React-Redux中上传多个文件

node.js 和 postgres 批量更新插入或其他模式?

node.js - 使用 .toArray 查询不会返回任何结果供查看

javascript - 有没有办法仅在事件持续一段时间后才触发函数

javascript - 从 HTML 页面运行 Javascript 游戏

javascript - 使用传递的变量加载快速模板返回错误 `Cannot set headers after they are sent to the client`

node.js - Sequelize - 要定义外键,我应该使用引用还是 belongsTo?或两者?

javascript - 无法删除 JQuery Accordion 标题之间的空格

mysql - 如何在使用文本存储表情符号时修复 "Internal server error"