Express-Sitzungs-ID kann nicht von Cookies mit Socket.IO abgerufen werden

Ich habe eine typische Webanwendung in Node, die das Express-Framework und die Session-Middleware verwendet. Ich verwende Socket.io auch für bestimmte dynamische Teile meiner Anwendung (derzeit ist dies ein Chat-Mechanismus, aber das ist tangential). Ich konnte Sessions und socket.io erfolgreich selbst einrichten, möchte sie aber kombinieren (z. B. Socket-Chat-Nachrichten mit Benutzerkonten verknüpfen, ohne die Datenbank zu berühren).

Es sollte beachtet werden (und ich sehe, dass dies ein möglicher Problempunkt ist), dass ich zwei Express-Server an verschiedenen Ports betreibe: einen für normalen HTTP-Verkehr und einen für HTTPS-Verkehr. Ich habe jedoch beide Server eine IDential-Konfiguration und teile den gleichen Sitzungsspeicher. Sitzungen zwischen http- und https-Seiten bleiben für mich bestehen. Die Sitzung wird anfänglich über eine Seite eingerichtet, die von HTTPS bereitgestellt wird, und die Seite socket.io ist Vanille-HTTP.

Ich folge dem Führer ausfindig gemachtHier um das zu erreichen, wonach ich suche, um socket.io und Sessions zu integrieren. Im Rahmen der Autorisierungsfunktion wird data.headers.cookie jedoch niemals festgelegt, obwohl die sitzungsbasierten Teile meiner Anwendung wie erwartet funktionieren. Seltsamer ist, dass nach dem Einstellen einer Sitzung, wenn ich eineconsole.log(document.cookie) Aus dem Browser heraus erhalte ich eine leere Zeichenfolge. Wenn ich jedoch meine Cookies mit der Firefox-Entwickler-Symbolleiste betrachte, gibt es ein SID-Cookie für Express und Connect.

Hier ist der relevante Teil des Servercodes:

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

Und hier ist der relevante Code auf dem Client:

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

AKTUALISIEREN

Auch nach dem manuellen Setzen eines Cookies (und nicht nur einer Sitzungsvariablen) in der Route für die Seite, die SocketIO verwendet, fehlt der Cookie-Teil der Anfrage.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage