为什么socket.io使用不同的path创build第二个“sid”cookie?

我正在拉起一个项目,我发誓这不是一个问题以前,但显然不是现在 – 我可能做一些愚蠢的事情。 我看到express&socket.io创build了两个不同的“sid”cookie,一个是“/”path,另一个是“/socket.io”path。 我期望的行为是分享我的快递应用程序和套接字之间相同的cookie /会话。

“/”的“sid”cookie: “sid”为“/”

“/ socket.io”的“sid”cookie: “sid”为“/socket.io”

我正在通过以下方式设置快递:

var config = require('config'); var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var sessionStore = require('./session-store'); var sessionConfig = { store : sessionStore, secret : config.server.sessionSecret, key : config.server.sessionKey, saveUninitialized : true, resave : true, cookie : { secure: config.server.useHTTPS } }; module.exports = function (app) { app.use(cookieParser(config.server.sessionSecret)); app.use(session(sessionConfig)); }; 

我正在通过设置socket.io:

 var config = require('config'); var redis = require('socket.io-redis')(config.redis.socket); var cookieParser = require('socket.io-cookie-parser'); var sessionStore = require('./session-store'); module.exports = function (io) { io.adapter(redis); io.use(cookieParser(config.server.sessionSecret)); io.use(authorization); }; function authorization (socket, next) { var unauthorized = new Error('Unauthorized'); if (!socket.request.headers.cookie) { return next(unauthorized); } var sessionKey = socket.server.engine.cookie; var sessionId = socket.request.signedCookies[sessionKey] || socket.request.cookies[sessionKey]; if (!sessionId) { return next(unauthorized); } sessionStore.get(sessionId, function (err, session) { // use session's userId to fetch user & attach to socket }); } 

这两个文件从我的主要服务器文件绑定在一起:

 var http = require('http'); var express = require('express'); var socketio = require('socket.io'); var config = require('config'); var app = express(); var server = http.Server(app); var io = socketio(server, { cookie: config.server.sessionKey }); // initialize aspects of the app require('./config/initializers/io')(io); require('./config/initializers/express')(app); module.exports = server; 

好吧,我想我解决了它。 它看起来像在我的服务器上安装socket.io时提供cookie选项,导致engine.io根据以下代码行设置一个具有相同名称的cookie:

 if (false !== this.cookie) { transport.on('headers', function(headers){ headers['Set-Cookie'] = self.cookie + '=' + id; }); } 

根据RFC-2109 HTTP状态pipe理机制 ,默认path是当前URLpath:

 Path Defaults to the path of the request URL that generated the Set-Cookie response, up to, but not including, the right-most /. 

这将解释新创build的cookie,因为socket.io的端点默认是/socket.io 。 由于我使用自定义授权,无论如何读取一个cookie,我认为这是安全的,通过更改我的套接字实例化如下,在engine.io中禁用cookie:

 var io = socketio(server, { cookie: false }); 

这现在打破了原来的问题,包括我的authorizationfunction,特别是这一行:

 var sessionKey = socket.server.engine.cookie; 

由于我不再将cookie密钥传递给socket.io/engine.io,而是需要直接从我的configuration中读取:

 var sessionKey = config.server.sessionKey;