Nie można uzyskać identyfikatora sesji Express z plików cookie w / Socket.IO
Mam typową aplikację internetową w węźle, która wykorzystuje framework Express i oprogramowanie pośrednie sesji. Używam również Socket.io dla pewnych dynamicznych części mojej aplikacji (obecnie jest to mechanizm czatu, ale to styczny). Udało mi się samodzielnie skonfigurować sesje i socket.io, ale chciałbym je połączyć (np. Powiązać wiadomości czatu gniazd z kontami użytkowników bez uderzania w bazę danych).
Należy zauważyć (i widzę, że jest to możliwy problem), używam dwóch ekspresowych serwerów na różnych portach: jednego dla zwykłego ruchu HTTP, a drugiego dla ruchu HTTPS. Jednak oba serwery przechodzą identyczną konfigurację i współdzielą ten sam magazyn sesji. Sesje trwają dla mnie między stronami http i https. Sesja jest początkowo ustawiana za pośrednictwem strony obsługiwanej przez HTTPS, a strona socket.io to waniliowy HTTP.
Podążam za przewodnikiemtutaj osiągnąć to, czego szukam w zakresie integracji socket.io i sesji. Jednak w ramach funkcji autoryzacji data.headers.cookie nigdy nie jest ustawiana, mimo że części mojej aplikacji działające w oparciu o sesję działają zgodnie z oczekiwaniami. Co dziwniejsze, po ustawieniu sesji, jeśli zrobięconsole.log(document.cookie)
z poziomu przeglądarki otrzymuję pusty ciąg, ale gdy patrzę na moje pliki cookie z paska narzędzi programisty Firefox, istnieje plik cookie SID zarówno dla ekspresu, jak i połączenia.
Oto odpowiednia część kodu serwera:
<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>
A oto odpowiedni kod na kliencie:
<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>
AKTUALIZACJA
Nawet po ręcznym ustawieniu pliku cookie (a nie tylko zmiennej sesji) na trasie strony, która używa SocketIO, część wniosku dotycząca plików cookie jest nadal nieobecna.