Passport策略中的"完成"回调函数配置"使用"功能

Ste*_*ung 24 javascript callback node.js express passport.js

我是node.js和express.js noob.这个问题可能看起来很傻,但我真的很困惑.

我正在尝试使用护照配置Local Strategry身份验证.如官方文档所示,我们可以通过以下代码来计算本地策略,

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!user.verifyPassword(password)) { return done(null, false); }
      return done(null, user);
    });
  }
));
Run Code Online (Sandbox Code Playgroud)

我的困惑是关于done回调函数.当官方文档显示此局部策略在路由处理程序中用作中间件时,无需为此done回调传递函数参数.

app.post('/login', 
  passport.authenticate('local'),
  function(req, res) {
    res.redirect('/');
  });
Run Code Online (Sandbox Code Playgroud)

那么,done如果我们不提供函数参数,这个回调函数不会为null吗?如果没有,那done回调函数是什么以及在这个done回调函数中会发生什么过程?

Roy*_*loh 36

done战略实施内部调用的方法.

然后,正如您所见,它将导航到其中一个success/ error/ fail方法(再次,通过实现.还有更多选项).每个选项可以调用next,在你的代码片段,其中如下:

function(req, res) {
  res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)

success被调用时,它可以将用户连接请求或做其他事情,这取决于你的需求(它看起来为options您传递给passport.authenticate).如果你想确定何时next会被调用,你应该使用custom callback它,这会给你更多的灵活性.

我强烈建议您阅读来源.

  • passportjs文档需要重大改进 (29认同)

Mat*_*ton 7

现在已经是 2022 年了,我也有同样的问题。护照文档已得到改进,它在此处描述了该done方法(也称为cb): https: //www.passportjs.org/concepts/authentication/strategies/#verify-function。您需要在策略的验证函数中自己调用它。

验证函数在以下三种条件之一下产生:成功、失败或错误。

如果验证函数找到该凭证所属的用户,并且该凭证有效,它将使用身份验证用户调用回调:

return cb(null, user);
Run Code Online (Sandbox Code Playgroud)

如果凭证不属于已知用户,或者无效,则 verify 函数会使用 false 调用回调以指示身份验证失败:

return cb(null, false);
Run Code Online (Sandbox Code Playgroud)

如果发生错误,例如数据库不可用,则会以惯用的 Node.js 风格调用回调并显示错误:

return cb(err);
Run Code Online (Sandbox Code Playgroud)