title: persistent sessions with passport, mongodb and express
body: <p>I'm using passport to handle authentication and sessions in my application. I'm persisting sessions to mongodb using mongostore.</p>
  
  <p>The setup works fine in general. However, when I restart the server all users are logged out, so apparently sessions are hold in memory instead of being only persisted to mongodb. I'm trying to achieve a setup where users are still logged in when restarting the server.</p>
  
  <p>Basic configuration is as follows</p>
  
  <h1>middleware</h1>
  
  <pre><code>    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');
              }
          )
      }));
  </code></pre>
  
  <h1>passport</h1>
  
  <pre><code>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);
      });
  });
  </code></pre>
  
  <h1>github repo (including all code necessary to run code)</h1>
  
  <p>I created a barebone github repo including the code <a href="https://github.com/forste/passport-persistent-sessions">here</a></p>
  
  <p>just create a conf.js file in the root directory with your mongodb credentials, i.e. mongodbURL and mongodbName, run npm install and node app.js to get started.</p>
  
  <p>thanks</p>