javascript - Getting the current user in express.js, while using socket.io? -


i'm using express framework, , part of web app uses socket.io enable real-time chat. need current user's username, , create room him in it. problem can't find way user info when socket.on('connection') called. here's relevant code have far :

var express = require('express'); var passport = require('passport');                                                                                     var localstrategy = require('passport-local').strategy;                                                                 var mongoose = require('mongoose');                                                                                     var session = require('express-session');                                                                               var http = require('http'); var routes = require('./routes/index'); var app = express();                                                                                                    var server = http.createserver(app);                                                                                    var io = require('socket.io')(server);                                                                                   server.listen(4000); app.use(session({secret : 'anything',                                                                                       saveuninitialized: true,                                                                                                resave: true}));                                                                                                    app.use(passport.initialize());                                                                                         app.use(passport.session());  mongoose.connect('mongodb://localhost/my_db'); var schema = mongoose.schema;                                                                                           var userdetail = new schema({                                                                                               username: string,                                                                                                       password: string                                                                                                    }, {                                                                                                                        collection: 'users'                                                                                                 });                                                                                                                     var userdetails = mongoose.model('users', userdetail);                                                                   app.use('/', routes);                                                                                                   app.use('/users', users);                                                                                                app.post('/login',                                                                                                              passport.authenticate('local', {                                                                                            successredirect: '/loginsuccess',                                                                                       failureredirect: '/loginfailure',                                                                                   })                                                                                                                      );  io.on('connection', function(socket) {                                                                                      console.log('socket stuff');                                                                                            var sessionstore = session;                                                                                             var sessionid    = socket.handshake.sessionid;                                                                           sessionstore.get(sessionid, function(err, session) {                                                                        if(!err) {                                                                                                                  console.log('no error');                                                                                                if(session.passport.user) {                                                                                                 console.log('this users email address %s', session.passport.user);                                           }                                                                                                                   }                                                                                                                   });                                                                                                                     socket.emit('newmessage', {content : 'chat message content'});                                                      }); 

the last function i'm having trouble. when user requests page, can find username req.user, have no idea how when don't have req. code have sessions in io.on('connection') not work @ all, , throws errors, figured i'd keep in show i've tried far.

this has been asked few times older answers found not work anymore. answer lies in parsing socket.handshake.headers.cookie hacky , depend on internals of express-session.

anyways, should work express 4 , socket.io 1.1:

var express   = require('express'),     session   = require('express-session'),     cookie    = require('cookie'),     signature = require('cookie-signature');  var app    = express(),      store  = new session.memorystore(),     secret = 'session-secret-key',     name   = 'connect.sid';  app.use(session({   name:   name,   secret: secret,   store:  store,   resave: true,   saveuninitialized: true }));  var server = require('http').createserver(app),     io     = require('socket.io')(server);  io.on('connection', function(socket) {   if (socket.handshake && socket.handshake.headers && socket.handshake.headers.cookie) {     var raw = cookie.parse(socket.handshake.headers.cookie)[name];     if (raw) {       // cookie set express-session begins s: indicates       // signed cookie. remove 2 characters before unsigning.       socket.sessionid = signature.unsign(raw.slice(2), secret) || undefined;     }   }   if (socket.sessionid) {     store.get(socket.sessionid, function(err, session) {       console.log(session);     });   } }); 

Comments

Popular posts from this blog

java - How to specify maven bin in eclipse maven plugin? -

single sign on - Logging into Plone site with credentials passed through HTTP -

php - Why does AJAX not process login form? -