2013-04-17 3 views
18

Я использую паспорт для проверки подлинности и сеансов в своем приложении. Я продолжаю сеансы в mongodb, используя mongostore.постоянные сессии с паспортом, mongodb и экспресс

Установка работает нормально в целом. Однако, когда я перезапускаю сервер, все пользователи выходят из системы, поэтому, по-видимому, сеансы хранятся в памяти, а не только сохраняются в mongodb. Я пытаюсь выполнить настройку, когда пользователи все еще регистрируются при перезапуске сервера.

Базовая конфигурация выглядит следующим образом

промежуточного

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 репо (в том числе весь код, необходимый для запуска кода)

Я создал Barebone GitHub репо включая код here

просто создайте файл conf.js в корневом каталоге с вашими учетными данными mongodb, т. Е. MongodbURL и mongodbName, запустите npm install и узел app.js, чтобы начать.

благодаря

+0

Фактически не записывать данные на диск, что делает веб-масштаб mongodb ;-) См. Http://www.youtube.com/watch?v=b2F-DItXtZs – jarmod

ответ

28

passport.session() не несет никакой конфигурации, так как Экспресс-версии 4.X это session() вам нужно настроить:

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

Кроме того, maxAge (который должен быть свойством cookie) не принимает аргумент Date, но всего лишь миллисекунды сеанс должен быть действительным.

Для получения инструкций по использованию сеанса модуля промежуточного программного обеспечения вы можете узнать больше here.

Смежные вопросы