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

片段来自这里。可以看出,在某些情况下, amessage作为第三个参数传入对象中done()。我们如何message在路由方法中访问它?

4

2 回答 2

8

您应该能够访问作为第三个参数传递的信息req.authInfo

您可以将此处的处理视为info,它被分配给authInfo并用于闪存消息。

于 2013-02-04T02:54:06.217 回答
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,您可以在经过验证的函数中看到信息被传递给失败和成功操作。

因此,另外,您可以指定 atype和 amessage属性,这些将用于显示给用户的闪存状态信息消息。(type用户通过身份验证时默认为“成功”,否则为“错误”)。

Flash 消息通过 request.flash() 函数在 Express 2.x 中工作。这已在 Express 3.x 中删除 -如果您需要此功能,建议使用connect-flash中间件。

于 2013-02-04T06:17:29.120 回答