passport.js 不填充 login/signup 上的数据

passport.js doesn't populate data on login/signup

版本:

我的会话中间件

let sessionMiddleware = session({
    store: sessionStore,
    secret: process.env.SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
        secure: false,
        httpOnly: true
    }
});

对于 serializeUser/deserializeUser 我正在使用我的自定义回调:

passport.serializeUser((user, done) => {
    db.User.findById(user._id)
        .populate('role', ['code'])
        .exec((err, data) => {
            if (err) { 
                console.info('\n Error:', err);
            } else {
                console.info(11, data);
                done(null, data);
            }
        })
});
passport.deserializeUser((user, done) => {
    db.User.findById(user._id)
        .populate('role', ['code'])
        .exec((err, data) => {
            if (err) { 
                console.info('\n Error:', err);
            } else {
                done(null, data);
            }
        })
});

它适用于任何请求,而且我可以很好地获得用户角色。 但它在登录时不起作用:

// User object from passport.authenticate callback
{
  _id: 5eb8596e049f2131487725eb,
  email: 'test@gmail.com',
  login: 'test',
  role: 5eb855dc91fd0548fc968939,
  salt: /* MY SALT */,
  hash: /* MY PASSWORD HASH */,
  createdAt: 2020-05-10T19:43:42.797Z,
  updatedAt: 2020-05-10T19:43:42.797Z,
  __v: 0
}

但是 serializeUser 确实有效,它在 auth 之后被调用,返回具有正确角色对象的 User 对象:

// user object on serialize-deserialize User, i.e. on any request other than login/signup
{
  _id: 5eb8596e049f2131487725eb,
  email: 'test@gmail.com',
  login: 'test',
  role: { _id: 5eb855dc91fd0548fc968939, code: 'tech_sup' },
  createdAt: 2020-05-10T19:43:42.797Z,
  updatedAt: 2020-05-10T19:43:42.797Z,
  __v: 0
}

问题是,它在 passport.authenticate 之后填充,因此它没有更新 req.user。

如何在 login/signup 上使用 mongoose 使护照填充数据?

万一有人遇到同样的问题:

我也在使用 passport-local-mongoose,我想对于任何其他商店您都需要相同的东西:

1) 请确保您的护照。serializeUser AND 护照。deserializeUser 接受默认处理程序(在我的例子中,它分别是 db.User.serializeUser() 和 db.User.deserializeUser())
2) 在你使用 passport-local-mongoose 作为用户模式的地方添加下一个选项 - findByUserName:

User.plugin(passportMongoose, {
    /** any other options you use for passport-local-mongoose plugin */
    [...pluginOptions]
    /** added option to solve the problem */
    findByUsername: (model, queryParameters) => model.findOne(queryParameters).populate('role', ['code']),
});