giv*_*ivo 5 javascript session mongoose express passport.js
我正在使用快递,猫鼬和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);
Run Code Online (Sandbox Code Playgroud)
使用User猫鼬给我的对象配置护照:
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
Run Code Online (Sandbox Code Playgroud)
并配置我的应用程序在导航到此路线时对用户进行身份验证:
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' });
});
Run Code Online (Sandbox Code Playgroud)
现在我能够成功验证用户身份.浏览器会保存会话ID cookie.
我的问题是,每次用户刷新页面时,护照都不会使用会话ID反序列化用户,这会使用户无法进行身份验证.
在访问req.user站点根目录中的对象时,我得到了undefined什么让我意识到护照不会正确反序列化用户:
app.use('/', function (req, res, next) {
console.log(req.user); // prints undefined.
next();
});
Run Code Online (Sandbox Code Playgroud)
刷新页面后恢复用户的正确方法是什么?
解决方案是将会话存储在数据库中。我使用connect-mongo。
应用程序.js:
var mongoose = require('mongoose');
var expressSession = require('express-session');
var MongoStore = require('connect-mongo')(expressSession);
mongoose.connect(db_url, function (err) {
if (err) {
console.log(err);
}
});
app.use(expressSession({
secret: process.env.SESSION_SECRET || 'keyboard cat',
resave: false,
saveUninitialized: false,
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
Run Code Online (Sandbox Code Playgroud)
此后,即使刷新页面后,req.isAuthenticated()也会返回每个请求。true(这要归功于app.use(passport.session())它出现在任何路由处理程序之前)
app.use('/', function (req, res, next) {
if (req.isAuthenticated()) {
// returns true if a user already logged in.
}
next();
});
Run Code Online (Sandbox Code Playgroud)