persistent sessions with passport, mongodb and express

19,358

passport.session() doesn't take any configuration, as of Express version 4.X it's session() you need to configure:

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

Also, maxAge (which should be a property of cookie) doesn't take a Date argument, but just the number of milliseconds a session should be valid.

For instructions on using the express middleware module session, you can find out more here.

Share:
19,358
forste
Author by

forste

I help organizations provide their services online, specializing in platform design. Co-organizer @restartersbcn

Updated on June 06, 2022

Comments

  • forste
    forste almost 2 years

    I'm using passport to handle authentication and sessions in my application. I'm persisting sessions to mongodb using mongostore.

    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.

    Basic configuration is as follows

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

    passport

    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 (including all code necessary to run code)

    I created a barebone github repo including the code here

    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.

    thanks