问题描述
所以我正在制作一个包含个人资料和内容的应用程序。并且用户将通过使用路由 /user/:id(:id 将是 req.user.id)连接到他的个人资料,事情是当我尝试使用相同的用户名登录用户时,req.user 是相同的即使他们有不同的电子邮件/凭证。我认为这是因为我正在使用护照,并且在序列化用户时,将他的凭据保存到会话就是保存用户名,当然,在反序列化时,它将通过用户名找到用户。我已经尝试将会话密钥更改为电子邮件或 ID,因此它找不到具有相同用户名的用户,但我无法使其工作。 这是代码
passport.serializeUser(User.serializeUser(function (user,done) {
done(null,user.email)
}));
passport.deserializeUser(User.deserializeUser(function (email,done) {
user.findById(id,function (err,user) {
done(err,user)
})
}))
OUTPUT
Session {
cookie: {
path: '/',_expires: 2021-05-11T18:40:11.634Z,originalMaxAge: 604800000,httpOnly: true
},flash: {},passport: { user: User's name }
}
如您所见,尽管我正在尝试将电子邮件密钥添加到会话中,但它似乎不起作用。 有人可以帮我解决这个问题,甚至提出一个新的解决方案
解决方法
我建议调查 User.serializeUser
和 User.deserializeUser
正在影响的事情。我不清楚为什么他们会通过护照方法。
以下是一个通用实现的想法,它可以简化您获取数据并将其传递给 req
对象的方式。
passport.serializeUser((user,done) => {
done(null,user.email);
});
passport.deserializeUser((email,done) => {
// Mongoose query
// Find matching user based on email
const user = await User.findOne({ email }).exec();
done(null,user);
});