2013-04-17 3 views
18

Ich benutze Pass, um Authentifizierung und Sitzungen in meiner Anwendung zu behandeln. Ich halte Sitzungen zu mongodb mit mongostore.hartnäckige Sitzungen mit Pass, Mongodb und Express

Das Setup funktioniert im Allgemeinen gut. Wenn ich jedoch den Server neu starte, werden alle Benutzer ausgeloggt, so dass anscheinend Sitzungen im Speicher gehalten werden, anstatt nur auf mongodb gespeichert zu werden. Ich versuche ein Setup zu erreichen, bei dem Benutzer beim Neustart des Servers noch angemeldet sind.

Grundkonfiguration ist als

Middleware folgt

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

Pass

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 (einschließlich aller erforderlichen Code Code auszuführen)

ich ein Barebone GitHub Repo erstellt einschließlich des Codes here

Erstellen Sie einfach eine Datei conf.js im Stammverzeichnis mit Ihren mongodb-Anmeldedaten, d. H. MongodbURL und mongodbName, führen Sie npm install und node app.js aus, um loszulegen.

dank

+0

Nicht wirklich Daten auf die Festplatte schreiben ist das, was mongodb web scale macht ;-) Siehe http://www.youtube.com/watch?v=b2F-DItXtZs – jarmod

Antwort

28

passport.session() nimmt keine Konfiguration, wie der Express-Version 4.X ist es session() Sie konfigurieren müssen:

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

Auch maxAge (die eine Eigenschaft von cookie sein sollte) nimmt kein Date Argument, aber nur die Anzahl der Millisekunden eine Sitzung sollte gültig sein.

Anweisungen zur Verwendung der Express-Middleware-Modulsitzung finden Sie unter here.