页面刷新后NodeJS快速会话过期

每次刷新页面时,我的nodejs应用程序的会话都将过期,login后。 如果我访问不同的页面,它确实工作正常,但只要刷新页面,会话结束。 我尝试了几件事情,但似乎没有任何工作。 即使在页面刷新后,我怎样才能防止它过期? 如果我可以将会话存储在数据库或其他地方,以防止它过期。

这里是文件

护照init.js

var mongoose = require('mongoose'); var User = mongoose.model('user'); var localStrategy = require('passport-local').Strategy; var bcrypt = require('bcrypt-nodejs'); module.exports = function(passport) { passport.serializeUser(function(user, done) { console.log('serializing user:',user.username); done(null, user._id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { if(err) { done(500,err); } console.log('deserializing user:',user.username); done(err, user); }); }); passport.use('login', new localStrategy({ passReqToCallback : true }, function(req, username, password, done) { User.findOne({'username': username}, function(err, user) { if(err) { return done(err); } if(!user) { console.log("UserName or Password Incorrect"); return done(null, false); } if(!isValidPassword(user, password)) { console.log("UserName or Password is Incorrect"); return done(null, false); } return done(null, user); }); })); passport.use('signup', new localStrategy({ passReqToCallback : true }, function(req, username, password, done) { User.findOne({'username': username}, function(err, user) { if(err) { console.log("Error in signup"); return done(err); } if(user) { console.log("Username already exist" + username); return(null, false); } else { var newUser = new User(); newUser.username = username; newUser.password = createHash(password); newUser.save(function(err) { if(err) { console.log("Error in saving user"); throw err; } console.log(newUser.username + ' Registration succesful'); return done(null, newUser); }); } }); })); var isValidPassword = function(user, password) { return bcrypt.compareSync(password, user.password); } var createHash = function(password) { return bcrypt.hashSync(password, bcrypt.genSaltSync(10), null); } }; 

Auth.js

 var express = require('express'); var router = express.Router(); module.exports = function(passport) { router.get('/success', function(req, res) { res.send({state: 'success', user: req.user ? req.user : null}); }); router.get('/failure', function(req, res) { res.send({state: 'failure', user: null, message: 'Invalid Username or Password'}); }); router.post('/login', passport.authenticate('login', { successRedirect: '/auth/success', failureRedirect: '/auth/failure' })); router.post('/signup', passport.authenticate('signup', { successRedirect: '/auth/success', failureRedirect: '/auth/failure' })); router.get('/logout', function(req, res) { req.logout(); res.redirect('/'); }); return router; }; 

Server.js

 var express = require('express'); var path = require('path'); var app = express(); var server = require('http').Server(app); var logger = require('morgan'); var passport = require('passport'); var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var mongoose = require('mongoose'); var MongoStore = require('connect-mongo')(session); mongoose.connect("mongodb://localhost:27017/scriptknackData"); require('./models/model'); var api = require('./routes/api'); var auth = require('./routes/auth')(passport); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: false})); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use(passport.initialize()); app.use(passport.session()); app.use(session({ secret: 'super secret key', resave: true, cookie: { maxAge: 60000 }, saveUninitialized: true, store: new MongoStore({ mongooseConnection: mongoose.connection }) })); var initpassport = require('./passport-init'); initpassport(passport); app.use('/api', api); app.use('/auth', auth); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); var port = process.env.PORT || 3000; server.listen(port, function() { console.log("connected"); }); 

根据快速会议文件

cookie.maxAge指定计算Expires Set-Cookie属性时使用的数字(以毫秒为单位)。 这通过获取当前服务器时间并将MaxAge毫秒添加到该值来计算Expiresdate时间来完成。 缺省情况下,不设置最大时间。

并在passport.session()之前使用express.session()来确保login会话以正确的顺序存储。 护照文件

在你的情况下,你已经指定maxAge只有60000ms(60sec) 。 尝试这个:

 ... app.use(session({ secret: 'super secret key', resave: true, cookie: { maxAge: 8*60*60*1000 }, // 8 hours saveUninitialized: true, store: new MongoStore({ mongooseConnection: mongoose.connection }) })); app.use(passport.initialize()); app.use(passport.session()); ... 

根据您的需要增加您的cookie maxAge值,它将解决您的问题。

根据精细的手册 (重点是我的):

请注意,启用会话支持完全是可选的,尽pipe它对于大多数应用程序是推荐的。 如果启用,请务必在passport.session() express.session()之前使用express.session() ,以确保login会话以正确的顺序恢复。

在你的情况下,订单是不正确的。 尝试这个:

 ... app.use(session({ secret: 'super secret key', resave: true, cookie: { maxAge: 60000 }, saveUninitialized: true, store: new MongoStore({ mongooseConnection: mongoose.connection }) })); app.use(passport.initialize()); app.use(passport.session()); ...