【发布时间】:2015-06-25 14:30:55
【问题描述】:
我正在使用 express、mongoose 和 passportjs 构建 SPA。
我为我的用户创建了一个简单的架构:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
var User = new Schema({
username: String,
password: String,
first_name: String
}, { collection: 'users' });
User.plugin(passportLocalMongoose);
mongoose.model('User', User);
使用 mongoose 给我的 User 对象配置护照:
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
并配置我的应用程序在导航到此路线时对用户进行身份验证:
app.post('/login', passport.authenticate('local'), function(req, res, next) {
if (req.isAuthenticated()) {
return res.json({ state: 'success', user: { first_name: req.user.first_name } });
}
return res.json({ state: 'failure', message: 'cannot authenticate' });
});
现在我可以成功验证用户身份。并且浏览器会保存一个会话 id cookie。
我的问题是每次用户刷新页面护照都不会使用会话ID反序列化用户,是什么使用户未经身份验证。
访问站点根目录中的req.user 对象时,我得到undefined,这让我意识到护照没有正确反序列化用户:
app.use('/', function (req, res, next) {
console.log(req.user); // prints undefined.
next();
});
刷新页面后恢复用户的正确方法是什么?
【问题讨论】:
-
Mongoose 必须反序列化用户,如果您调用的是
passport.deserializeUser(User.deserializeUser());
标签: javascript session express mongoose passport.js