2013-04-17 1 views
18

Uso il passaporto per gestire l'autenticazione e le sessioni nella mia applicazione. Sto persistendo sessioni a mongodb usando mongostore.sessioni persistenti con passaporto, mongodb ed express

L'installazione funziona bene in generale. Tuttavia, quando riavvio il server, tutti gli utenti vengono disconnessi, quindi apparentemente le sessioni vengono mantenute in memoria anziché essere mantenute solo su mongodb. Sto cercando di ottenere una configurazione in cui gli utenti sono ancora loggati quando si riavvia il server.

configurazione di base è la seguente

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

passaporto

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 pronti contro termine (incluso tutto il codice necessario per eseguire il codice)

ho creato un barebone github repo compreso il codice here

è sufficiente creare un file conf.js nella directory root con le credenziali mongodb, ad es. MongodbURL e mongodbName, eseguire npm install e node app.js per iniziare.

grazie

+0

In realtà non scrivere dati su disco è ciò che rende la scala Web di mongodb ;-) Vedi http://www.youtube.com/watch?v=b2F-DItXtZs – jarmod

risposta

28

passport.session() non si assume alcuna configurazione, come di Express versione 4.X è session() è necessario configurare:

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

Inoltre, maxAge (che dovrebbe essere una proprietà di cookie) non accetta un argomento Date, ma solo il numero di millisecondi che una sessione dovrebbe essere valida.

Per istruzioni sull'utilizzo della sessione del modulo middleware express, è possibile trovare ulteriori informazioni su here.