2012-07-27 16 views
12

Con la última versión de connect (desde 2012-07-26), he encontrado la siguiente manera para obtener una ID de sesión de socket.io eso funcionará con una tienda connect-redis.socket.io parse connect (> = 2.4.1) cookie de sesión firmada

var express = require('express') 
, routes = require('./routes') 
, fs = require('fs') 
, http = require('http') 
, io = require('socket.io') 
, redis = require('connect-redis') 
, connect = require('express/node_modules/connect') 
, parseSignedCookie = connect.utils.parseSignedCookie 
, cookie = require('express/node_modules/cookie'); 

var secret = '...'; 
var rStore = new(require('connect-redis')(express)); 

//... 

var server = http.createServer(app); 
var sio = io.listen(server); 

sio.set('authorization', function(data, accept) { 
    if(data.headers.cookie) { 
     data.cookie = cookie.parse(data.headers.cookie); 
     data.sessionID = parseSignedCookie(data.cookie['connect.sid'], secret); 
    } else { 
     return accept('No cookie transmitted', false); 
    } 
    accept(null, true); 
}); 

data.sessionID continuación, se puede utilizar más adelante como

sio.sockets.on('connection', function(socket) { 
    console.log('New socket connection with ID: ' + socket.handshake.sessionID); 
    rStore.get(socket.handshake.sessionID, function(err, session) { 
     //... 
    }); 
}); 

tener que importar muchos de expreso (conectar, una utilidad de conexión, y el módulo de galletas) parece una forma excesivamente rotonda de conseguir las funciones necesarias para analizar las cookies firmadas de connect. ¿Alguien ha encontrado otra manera?

+2

Me gustaría poder upvote esta más de 100 veces. Su solución anterior me ha ahorrado mucho tiempo, ¡gracias por publicarla! Lo siento, no puedo sugerir otra manera. – LDK

Respuesta

6

Me encontré con el mismo y acabo de escribir un pequeño módulo para abstraerlo. Así es como se ve su uso. Fue escrito y probado usando Express 3, por lo que debería funcionar bien con connect 2.4.x. Por favor, avíseme lo contrario.

var SessionSockets = require('session.socket.io') 
    , sessionSockets = new SessionSockets(io, sessionStore, cookieParser); 

sessionSockets.on('connection', function (err, socket, session) { 
    //your regular socket.io code goes here 
}); 

Para más detalles sobre cómo funciona veo https://github.com/wcamarao/session.socket.io

Cuestiones relacionadas