持护照,mongodb和快递会议

我正在使用护照来处理我的应用程序中的身份validation和会话。 我坚持使用mongostore的会话MongoDB。

一般来说设置工作正常。 但是,当我重新启动服务器时,所有的用户都注销了,所以显然会话被保存在内存中,而不是只保存到mongodb。 我正在尝试实现一个用户在重新启动服务器时仍然login的设置。

基本configuration如下

中间件

app.use(express.cookieParser('your secret here')); app.use(express.session()); app.use(passport.initialize()); app.use(passport.session({ maxAge: new Date(Date.now() + 3600000), store: new MongoStore( { db: mongodb.Db( conf.mongodbName, new mongodb.Server( 'localhost', 27017, { auto_reconnect: true, native_parser: true } ), { journal: true } ) }, function(error) { if(error) { return console.error('Failed connecting mongostore for storing session data. %s', error.stack); } return console.log('Connected mongostore for storing session data'); } ) })); 

护照

 passport.use(new LocalStrategy( { usernameField: 'email', passwordField: 'password' }, function(email, password, done) { console.log('user %s attempting to authenticated', email); return User.findOne({email:email}, function(error, user) { if(error) { console.error('Failed saving user %s. %s', user.id, error.stack); return done(error); } if(!user) { return done(null, false); } console.log('user %s logged in successfully', user.id); return done(null, { //passed to callback of passport.serializeUser id : user.id }); }); } )); passport.serializeUser(function(user, done) { return done(null, user.id); //this is the 'user' property saved in req.session.passport.user }); passport.deserializeUser(function (id, done) { return User.findOne({ id: id }, function (error, user) { return done(error, user); }); }); 

github回购(包括运行代码所需的所有代码)

我创build了一个包含代码的准系统github回购

只需用你的mongodb凭证(即mongodbURL和mongodbName)在根目录下创build一个conf.js文件,运行npm install和node app.js即可开始。

谢谢

passport.session()不需要任何configuration,从Express版本4.X开始它是session()你需要configuration:

 app.use(session({ cookie : { maxAge: 3600000 // see below }, store : new MongoStore(...) }); ... app.use(passport.session()); 

另外, maxAge (它应该是cookie一个属性)不会使用Date参数,而只是会话应该有效的毫秒数。

有关使用快速中间件模块会话的说明,请参阅此处 。