2012-07-27 3 views
12

Mit der neuesten Version von connect (Stand 2012-07-26) habe ich den folgenden Weg gefunden, um eine Session-ID von socket.io zu erhalten das funktioniert mit einem Connect-Redis-Speicher.socket.io parse connect (> = 2.4.1) signiertes Session-Cookie

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 dann als

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

so viele von Express importieren zu müssen (eine Verbindung, ein Dienstprogramm von connect, und dem Cookie-Modul) scheint wie ein zu Umwegen zu bekommen die Funktionen, die benötigt werden, um die signierten Cookies von connect zu analysieren. Hat jemand einen anderen Weg gefunden?

+2

ich sehen wünschte, ich könnte dieses über 100-mal upvote. Ihre obige Lösung hat mir viel Zeit gespart, danke, dass Sie es gepostet haben! Es tut mir leid, dass ich keinen anderen Weg vorschlagen kann. – LDK

Antwort

6

Ich lief in das gleiche und schrieb nur ein kleines Modul, um es zu abstrahieren. So sieht seine Verwendung aus. Es wurde mit Express 3 geschrieben und getestet, sollte also mit Connect 2.4.x funktionieren. Bitte lass es mich wissen.

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

Weitere Informationen darüber, wie es funktioniert https://github.com/wcamarao/session.socket.io