passport.js 不填充 login/signup 上的数据
passport.js doesn't populate data on login/signup
版本:
- "passport": "0.4.1",
- "passport-local": "1.0.0",
- "passport-local-mongoose": "6.0.1"
- "express": "4.17.1",
- "express-session": "1.17.1",
我的会话中间件
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']),
});
版本:
- "passport": "0.4.1",
- "passport-local": "1.0.0",
- "passport-local-mongoose": "6.0.1"
- "express": "4.17.1",
- "express-session": "1.17.1",
我的会话中间件
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']),
});