Node.js + Passport:在done()方法中第三个参数'info'会发生什么?

cra*_*man 6 node.js passport.js

我发现该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);
    });
  }
));
Run Code Online (Sandbox Code Playgroud)

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

log*_*yth 8

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

你可以看到处理这里info,在那里它被分配给authInfo并用于闪存的消息.


And*_*rew 5

info是一个可选参数,可以包含可能在验证功能期间确定的其他用户信息,例如角色,用户配置文件或授权.这有助于第三方身份验证策略,因为一旦用户成功通过身份验证,就可以传递有关经过身份验证的用户的这些详细信息.否则,您可能必须在第二次查看它们,这是低效的.

正如loganfsmyth指出的那样,info设置为req.authInfo使得middlware或路由可以在以后访问它.

此外,您可以通过注册transformAuthInfo来进一步转换info对象,如下所示:

passport.transformAuthInfo(function(info, done) {
  Client.findById(info.clientID, function (err, client) {
    info.client = client;
    done(err, info);
  });
});
Run Code Online (Sandbox Code Playgroud)

对于LocalStrategy,您可以在已验证的函数中看到信息传递给失败和成功操作.

此外,您还可以指定a typemessage属性,这些属性将用于向用户显示的闪存状态信息消息中.(type用户通过身份验证时默认为"成功",否则为"错误").

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