2012-07-18 28 views
15

Estoy usando WebSockets npm install ws en el mismo puerto en el que se está ejecutando Express.¿Cómo puedo obtener el ID de sesión (Express) para una conexión websocket?

Me gustaría recoger el 'sessionID' asociado de la conexión HTTP que acaba de crearse y actualizarse a WebSocket.

// start express listening 
server.listen(conf.server.port, conf.server.host); 

var WebSocketServer = require('ws').Server 
    , wss = new WebSocketServer({server: server}); 

wss.on('connection', function(ws) { 
    var sessionID = // how do I get this? 
    ws.on('message', function(message) { 
     console.log('received: %s', message); 
    }); 
    ws.send('something'); 
}); 

¿Cómo se puede hacer esto?

(actualmente trabajo en torno al tema mediante el envío de la Id.sesión en la página, pero esto es feo.)

Respuesta

14
  1. galletas Analizar
  2. Obtener ID de sesión
  3. Obtener datos de la sesión

    var express = require('express'); 
    var parseCookie = express.cookieParser(); 
    var MemoryStore = express.session.MemoryStore; 
    
    var store = new MemoryStore(); 
    
    app.configure(function() { 
        app.use(express.session({ store: store, secret: '123456', key: 'sid' })); 
    }); 
    
    wss.on('connection', function(ws) { 
        parseCookie(ws.upgradeReq, null, function(err) { 
         var sessionID = ws.upgradeReq.cookies['sid']; 
         store.get(sessionID, function(err, session) { 
          // session 
         }); 
        }); 
    
        ws.on('message', function(message) { 
         console.log('received: %s', message); 
        }); 
        ws.send('something'); 
    }); 
    
+1

Está en el camino correcto, pero no hay una cookie 'sid'. Hay: 'connect.sid: n8Pbh5hPhNNC3B6PAkyuaRgv.o9wnmI3fiJ47kJMUfW0xVcMRkhjFkMbgvki/CTtemvU' y' sessionid: 12d2b0c6f3c3eb661215a401d1942122'. ¿Cuál de estas es la clave de la sesión y cuál es la otra? – fadedbee

+0

'connect.sid' es la clave predeterminada para cookie express. En el ejemplo anterior, el código express fue configurado con la clave de sesión es 'sid' ... si no lo personalizas, la clave es 'connect.sid'. – nguyenkha

+0

Ah, mi culpa es solo por pegar la mitad de tu código. – fadedbee

5

Esto fue una pesadilla, ¡finalmente lo conseguí trabajando con las cookies firmadas!

Configurar el (tienda de ejemplo de memoria) de la tienda:

var MemoryStore = express.session.MemoryStore; 
store = new MemoryStore(); 

Expose parseCookie tan global (si lo necesita en otros módulos) de este tipo en los archivos de aplicación/servidor JS:

app.use(parseCookie = express.cookieParser('secret')); 

Ahora configure los sockets:

//this method gets called later 
var ensureAuthenticatedSocket = function(handshake, callback) { 
    cookie = cookieParser(handshake, null, function(err) { 
     var sessionID = handshake.signedCookies['sid']; 
     store.get(sessionID, function(err, session) { 
      callback(err, session); 
     }); 
    }); 
}; 
//listen time 
io = io.listen(server); 
//configure authentication 
io.configure(function() { 
    io.set('authorization', function(handshake, callback) { 
     //call the method with handshake as parameter, wait for callback 
     ensureAuthenticatedSocket(handshake, function(err, session) { 
      if (!err && session) { 
       //no error + found session = wicked! 
       callback(null, true); 
      } else { 
       callback(null, false); 
      } 
     }); 
    }); 
}); 
... 
//more socket code 
+5

Todo acerca de Node es actualmente una pesadilla. toda la información carece de MUCHAS cosas esenciales ... falta de explicaciones en todas partes, las cosas se dan por sentadas. – vsync

+0

@vsync L2 aplicación web señor. –

+0

Me parece que es aún mejor que php y dado que hago un montón de proyectos de principio a fin, el lenguaje común es mucho mejor para mí. – mattdlockyer

Cuestiones relacionadas