socket.io parse connect (›= 2.4.1) подписана бисквитка за сесия

С най-новата версия на connect (от 2012-07-26), открих следния начин да получа идентификатор на сесия от socket.io, който ще работи с магазин за свързване-redis.

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 след това може да се използва по-късно, като например

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

Необходимостта от импортиране на толкова много от express (connect, помощна програма на connect и модула за бисквитки) изглежда като прекалено заобиколен начин за получаване на функциите, необходими за анализиране на подписаните бисквитки на connect. Някой намерил ли е друг начин?


person Robert Winslow Dalpe    schedule 27.07.2012    source източник
comment
Иска ми се да мога да гласувам за това 100+ пъти. Вашето решение по-горе ми спести много време, благодаря ви, че го публикувахте! Съжалявам, че не мога да предложа друг начин.   -  person LDK    schedule 10.08.2012


Отговори (1)


Сблъсках се със същото и просто написах малък модул, за да го абстрахирам. Ето как изглежда използването му. Беше написано и тествано с помощта на express 3, така че трябва да работи добре с connect 2.4.x. Моля, уведомете ме в противен случай.

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

За повече подробности как работи вижте https://github.com/wcamarao/session.socket.io

person wcamarao    schedule 10.09.2012