Socket.io parse connect ( >= 2.4.1) подписанный файл cookie сеанса
С последней версией connect (по состоянию на 2012-07-26) я нашел следующий способ получить идентификатор сеанса из socket.io, который будет работать с хранилищем connect-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 и модуля cookie), похоже, чересчур крутой способ получить функции, необходимые для разбора подключенных подписанных файлов cookie. Кто-нибудь нашел другой способ?
Ответы
Ответ 1
Я столкнулся с тем же и написал небольшой модуль, чтобы отвлечь его. Вот как выглядит его использование. Он был написан и протестирован с использованием экспресс-3, поэтому он отлично работает с подключением 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