2013-04-17 19 views
18

Używam paszportu do obsługi uwierzytelniania i sesji w mojej aplikacji. Utrzymuję sesje z monondb używając mongostore.trwałe sesje z paszportem, mongodb i ekspresowe

Konfiguracja działa dobrze ogólnie. Jednak po ponownym uruchomieniu serwera wszyscy użytkownicy są wylogowani, więc najwyraźniej sesje są przechowywane w pamięci, a nie tylko trwają w mongodb. Próbuję osiągnąć konfigurację, w której użytkownicy są nadal zalogowani podczas restartowania serwera.

Podstawowa konfiguracja jest następująca

middleware

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'); 
      } 
     ) 
    })); 

paszport

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 repo (łącznie z wszystkimi kodu niezbędnego do uruchomienia kodu)

stworzyłem Barebone GitHub repo w tym kod here

wystarczy utworzyć plik conf.js w katalogu głównym z twoimi danymi uwierzytelniającymi mongodb, np. MongodbURL i mongodbName, uruchom npm install i node app.js, aby rozpocząć.

dzięki

+0

Faktyczne zapisywanie danych na dysku powoduje, że mongodb web scale ;-) Zobacz http://www.youtube.com/watch?v=b2F-DItXtZs – jarmod

Odpowiedz

28

passport.session() nie bierze żadnej konfiguracji, jak ekspresowych 4.x to session() trzeba skonfigurować:

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

Również maxAge (które powinny być własnością cookie) nie przyjmuje argumentu Date, ale tylko liczbę milisekund, jaką sesja powinna być ważna.

Aby uzyskać instrukcje dotyczące korzystania z sesji modułu pośredniego oprogramowania pośredniego, można znaleźć więcej informacji here.