Не удается& #39; не получить идентификатор сеанса Express из файлов cookie с Socket.IO

У меня есть типичное веб-приложение в Node, которое использует платформу Express и промежуточное программное обеспечение сеанса. Я также использую Socket.io для некоторых динамических частей моего приложения (в настоящее время, это механизм чата, но это тангенциальный ). Мне удалось успешно настроить сеансы и socket.io по отдельности, но я хотел бы объединить их (EG :, чтобы связать сообщения чата сокета с учетными записями пользователей, не затрагивая базу данных ).

Следует отметить (, и я вижу, что это возможная проблема ). Я использую два экспресс-сервера на разных портах :, один для обычного HTTP-трафика, а другой для HTTPS-трафика. Однако у меня оба сервера проходят одинаковую конфигурацию и используют одно и то же хранилище сеансов. Сеансы сохраняются для меня между страницами http и https. Сеанс изначально устанавливается через страницу, обслуживаемую HTTPS, а страница socket.io — это обычный HTTP.

Я следую руководству, расположенному здесь , чтобы достичь того, что я ищу в отношении интеграции socket.io и сеансов. Однако в рамках функции авторизации data.headers.cookie никогда не устанавливается,несмотря на то, что части моего приложения, основанные на сеансе -, работают должным образом. Что более странно, так это то, что после настройки сеанса, если я выполняю console.log(document.cookie)из браузера, я получаю пустую строку, но когда я смотрю на свои файлы cookie с помощью панели инструментов разработчика Firefox, там есть файл cookie SID как для экспресс, так и для соединять.

Вот соответствующая часть кода сервера:

var config = {
    ip          : "127.0.0.1",
    httpPort    : 2031,
    httpsPort   : 2032
};

var utils       = require("./utils"),
    express     = require('express'),
    fs          = require('fs'),
    parseCookie = require('./node_modules/express/node_modules/connect').utils.parseCookie,
    routes      = require('./routes')(config); 

var httpsOpts = {
    key : fs.readFileSync("cert/server-key.pem").toString(),
    cert: fs.readFileSync("cert/server-cert.pem").toString()
 };

var app             = express.createServer(),
    https           = express.createServer(httpsOpts),
    io              = require("socket.io").listen(app, { log: false}),
    helpers         = require("./helpers.js"),
    session         = new express.session.MemoryStore(),
    sessionConfig   = express.session({
        store   : session,
        secret  : 'secret',
        key     : 'express.sid',
        cookie  : {maxAge : 60 * 60 * 1000}
    }); //share this across http and https

configServer(app);
configServer(https);

//get SID for using sessions with sockets
io.set('authorization', function(data, accept){
    if(data.headers.cookie){
        data.cookie = parseCookie(data.headers.cookie);
        data.sessionID = data.cookie['express.sid'];
    } else {
        return accept("No cookie transmitted", false);
    }

    accept(null, true);
});

io.sockets.on('connection', function(socket){
    //pull out session information in here
});

function configServer(server) {
    server.configure(function(){
        server.dynamicHelpers(helpers.dynamicHelpers);
        server.helpers(helpers.staticHelpers);
        server.set('view options', { layout: false });
        server.set('view engine', 'mustache');
        server.set('views', __dirname + '/views');
        server.register(".mustache", require('stache'));
        server.use(express.static(__dirname + '/public'));
        server.use(express.bodyParser());
        server.use(express.cookieParser());
        server.use(sessionConfig);
    });
}

А вот соответствующий код на клиенте:



ОБНОВЛЕНИЕ

Даже после установки файла cookie вручную (, а не только переменной сеанса )в route для страницы, использующей SocketIO, часть запроса с файлами cookie по-прежнему отсутствует.

14
задан DuxPrime 28 April 2012 в 16:42
поделиться