Node.js + Passport:done()方法中的第三个参数'info'是什么?

6
我发现done()方法(或者我的调试器告诉我是success())有第三个参数,叫做info。请问这个参数传入的值会发生什么? 编辑 我所指的done()方法是我们必须在策略回调函数中调用的方法。例如:
var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

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, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

这段代码摘自这里。可以看到,在某些情况下,一个message会作为第三个参数以对象的形式传递给done()函数。我们怎样才能在路由方法中访问这个message呢?

请展示一些示例代码或指引我们正确的方向。这有点模糊。另外,我看到你打了标签,但是你的问题从未提到护照,所以我花了一段时间才意识到你在问什么。 - loganfsmyth
感谢@loganfsmyth的指出!我已经更新了q,请让我知道是否需要更多解释。 - craftsman
你能展示一下你是如何调用中间件的吗? - loganfsmyth
2个回答

8
您应该能够访问作为第三个参数传递的信息,如req.authInfo。您可以在此处查看处理过程(点击这里),其中将其分配给authInfo并用于闪存消息。

5

info 是一个可选参数,可以包含额外的用户信息,例如角色、用户资料或授权信息,这些信息可能在验证功能中被确定。

这有助于第三方身份验证策略,因为一旦成功验证用户,关于已认证用户的这些详细信息可以传递下去。否则,您可能需要稍后再次查找它们,这是低效的。

正如 loganfsmyth 指出的那样,info 设置在 req.authInfo 中,以便中间件或路由稍后可以访问它。

此外,您可以通过 注册 transformAuthInfo 进一步转换 info 对象,就像这样:

passport.transformAuthInfo(function(info, done) {
  Client.findById(info.clientID, function (err, client) {
    info.client = client;
    done(err, info);
  });
});

对于LocalStrategy,你可以在验证函数中查看到信息被传递给了失败和成功的操作
另外,你可以指定typemessage属性,这些属性将用于显示给用户的闪存状态信息消息。(当用户已通过身份验证时,默认情况下type为“success”,否则为“error”)。
在Express 2.x中,闪存消息通过request.flash()函数工作。 在Express 3.x中已删除此功能-如果需要此功能,则建议使用connect-flash中间件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接