2013-02-26 15 views
6

bramkiSesje z express.js + passport.js

Co chcę zrobić:

  • Tworzenie sesji dla użytkownika
  • Tworzenie sesji dla gniazda (socket.io)
  • Użyj numeru passport.js w celu uwierzytelnienia sesji logowania i sesji socket.

Uwagi

Mam zainstalowany MongoStore i passport.socket.io npm's. mogę się zalogować i ustawić cookie użytkownika zalogowany (connect.sid)


PYTANIE

Jak skonfigurować system do przechowywania socket sesje i parę je z session użytkownika?


kod

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 (część paszport)

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 część)

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

Odpowiedz

10

zapisać swoją nową historię pamięć instancję obiektu do zmiennej i przekazać go do wyrażania zarówno gniazdo jak i wy tak. (należy pamiętać, że korzystamy z różnych sklepów, ale teoretycznie nie powinno mieć znaczenia, co przechowywać można używać tak długo jak przekazać wyłączyć kontrolę właściwy sposób) ...

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

następnie w app.configure ci .. .

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

i wreszcie w socket.io skonfigurowania

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

Jeśli zrobiłeś to poprawnie a użytkownik pomyślnie uwierzytelnia powinieneś być w stanie uzyskać dostęp do t on dane sesji na obiekcie handshake.

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

Nadzieję, że pomaga.

+1

Dziękuję bardzo. Jeszcze jedno, po zrestartowaniu serwera sesja użytkowników zostaje usunięta, a strona wraca do ekranu logowania. – ashley

+0

Kiedy mówisz jeszcze jedno, czy chcesz, żebym odpowiedział, dlaczego sesja zostanie usunięta i wraca do logowania? –

+1

Myślę, że to właściwe zachowanie. Po ponownym uruchomieniu serwera należy rozpocząć wszystkie nowe sesje. Dzieje się tak dlatego, że trzeba ponownie uwierzytelnić się po ponownym uruchomieniu, a nowy identyfikator sesji jest generowany po uwierzytelnieniu. Czy chcesz, aby sesje były kontynuowane po restarcie serwera? –