No se puede obtener el ID de sesión Express de las cookies con Socket.IO

Tengo una aplicación web típica en Node que utiliza el marco Express y el middleware de sesión. También estoy usando Socket.io para ciertas partes dinámicas de mi aplicación (actualmente, esto es un mecanismo de chat, pero eso es tangencial). He podido configurar sesiones y socket.io con éxito por su cuenta, pero me gustaría combinarlos (por ejemplo, para asociar mensajes de chat de socket con cuentas de usuario sin llegar a la base de datos).

Se debe tener en cuenta (y puedo ver que este es un punto de posible problema), estoy ejecutando dos servidores Express en diferentes puertos: uno para el tráfico HTTP regular y otro para el tráfico HTTPS. Sin embargo, ambos servidores se someten a una configuración idéntica y comparten el mismo almacén de sesiones. Las sesiones persisten para mí entre las páginas http y https. La sesión se establece inicialmente a través de una página servida desde HTTPS y la página socket.io es HTTP de vainilla.

Estoy siguiendo la guía localizadaaquí para lograr lo que estoy buscando con respecto a la integración de socket.io y sesiones. Sin embargo, dentro de la función de autorización, data.headers.cookie nunca se establece, a pesar de que las partes de mi aplicación basadas en sesión funcionan como se esperaba. Lo que es más extraño es que después de configurar una sesión, si hago unaconsole.log(document.cookie) Desde el navegador, obtengo una cadena vacía, pero cuando veo mis cookies con la barra de herramientas para desarrolladores de Firefox, hay una cookie SID para Express y Connect.

Aquí está la parte relevante del código del servidor:

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

Y aquí está el código relevante en el cliente:

<code><script src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        var socket = io.connect('http://127.0.0.1'); //make sure this isn't localhost!
        socket.on('server', function(data){
            //socket logic is here
        });
    }
</script>
</code>

ACTUALIZAR

Incluso después de configurar una cookie manualmente (y no solo una variable de sesión) en la ruta de la página que utiliza SocketIO, la parte de cookies de la solicitud aún está ausente.

Respuestas a la pregunta(1)

Su respuesta a la pregunta