2013-02-26 2 views
6

TorSessions mit Express.js + passport.js

Was ich tun möchte:

  • Erstellen Sie eine Sitzung für den Benutzer
  • eine Sitzung für den Sockel erstellen (socket.io)
  • Verwenden Sie passport.js zum Authentifizieren der Anmeldung und socket Sitzungen.

Hinweise

Ich habe MongoStore und passport.socket.io npm's installiert. Ich kann die cookie des Benutzers in (connect.sid)


FRAGE

Wie richte ich das System sie mit dem session des Benutzers speichern socket Sitzungen und Paar angemeldet anmelden und eingestellt?


-Code

app.js

/* The usual express setup */ 
    passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    User = require('./models/user.js'), 
    MongoStore = require('connect-mongo')(express); 

app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.session({ 
    secret: 'chuck norris', 
    store: new MongoStore({db: User.name}, // the db's name 
     function(err) { 
      console.log(err || 'connect ok!'); 
     }) 
    })); 
    app.use(express.methodOverride()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 

app.js (der Pass Teil)

passport.use(new LocalStrategy({ 
    usernameField: 'username', 
    passwordField: 'password' 
    }, 
    function(username, password, done) { 
    User.findOne({username: username}, function(err, user) { 
     if(!user) { 
     return done(null, false, {message: 'Incorrect Username!'}); 
     } 
     if(!user.validPassword(password)) { 
     return done(null, false, {message: 'Incorrect Password!'}); 
     } 
     return done(null, user); 
    }); 
    } 
)); 


passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

app.post('/', 
    passport.authenticate('local'), 
    function(req, res) { 
     res.redirect('/home/'+req.user.username); 
    }); 

app.js (socket.io Teil)

io.set('authorization', passportSocket.authorize({ 
    key: 'connect.sid', 
    secret: 'chuck norris', 
    store: /* Not entirely sure what goes here */ 
    fail : function(data, accept) { accept(null, false); }, 
    success: function(data, accept) { accept(null, true); } 
})); 


io.sockets.on('connection', function(socket) { 
    console.log('User Connected: ' + socket.handshake.user.username); 
}); 

Antwort

10

Sie speichern Sie Ihre neue Objektinstanz Speicher Geschichte in eine Variable und gibt sie sowohl in auszudrücken und Buchse io wie so. (beachten Sie, dass wir verschiedene Geschäfte verwenden, aber es sollte keine Rolle, was Sie speichert verwenden, solange Sie die Kontrolle den richtigen Weg abgehen in der Theorie) ...

var ... 
,MemoryStore = express.session.MemoryStore 
,sessionStore = new MemoryStore(); 

dann Sie in app.configure .. .

app.use(express.session({store:sessionStore,secret:'secret',key:'express.sid'})); 

und schließlich in Socket.io configure

io.configure(function(){ 
io.set("authorization", passportSocketIo.authorize({ 
    key: 'express.sid',  //the cookie where express (or connect) stores its session id. 
    secret: 'secret', //the session secret to parse the cookie 
    store: sessionStore,  //the session store that express uses 
    fail: function(data, accept) { 
     // console.log("failed"); 
     // console.log(data);// *optional* callbacks on success or fail 
     accept(null, false);    // second param takes boolean on whether or not to allow handshake 
    }, 
    success: function(data, accept) { 
     // console.log("success socket.io auth"); 
    // console.log(data); 
     accept(null, true); 
    } 
})); 

Wenn Sie dies richtig und Ihre Benutzer getan haben erfolgreich authentifiziert sollten Sie dann in der Lage sein t zugreifen Die Sitzungsdaten des Handshake-Objekts.

console.log(socket.handshake.user.username); 
//or sometimes it might be... 
console.log(socket.handshake.user[0].username); 

Hoffe, dass hilft.

+1

Vielen Dank. Noch eine Sache, wenn der Server neu gestartet wird, wird die Benutzersitzung gelöscht und die Seite kehrt zum Anmeldebildschirm zurück. – ashley

+0

Wenn du noch eine Sache sagst, sagst du, du brauchst mich zu beantworten, warum deine Sitzung gelöscht wird und zurück zum Login geht ??? –

+1

Ich denke, das ist das richtige Verhalten. Sobald Sie den Server neu gestartet haben, sollte er alle neuen Sitzungen starten. Dies liegt daran, dass Sie sich nach dem Neustart erneut authentifizieren müssen und nach der Authentifizierung eine neue Sitzungs-ID generiert wird. Wollen Sie sagen, dass Sie Sitzungen auch nach dem Serverneustart beibehalten möchten? –