gpt4 book ai didi

node.js - 为什么 socket.io 使用不同的路径创建第二个 'sid' cookie?

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:20 25 4
gpt4 key购买 nike

我正在启动一个项目,我发誓这在以前不是问题,但现在显然不是——我可能在做一些愚蠢的事情。我看到 express & socket.io 创建了两个不同的“sid”cookie,一个路径为“/”,另一个路径为“/socket.io”。我期望的行为是在我的 express 应用程序和 socket.io 之间共享相同的 cookie/ session 。

“/”的“sid”cookie: "sid" for "/"

“/socket.io”的“sid”cookie: "sid" for "/socket.io"

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

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 根据 these lines of code 设置同名的 cookie。 :

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

根据 RFC-2109 HTTP State Management Mechanism ,默认路径为当前URL路径:

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

这可以解释为什么 socket.io 的端点默认是 /socket.io 之后创建的新 cookie。由于我正在使用自定义授权来读取 cookie,因此我认为通过将套接字实例化更改为以下内容来禁用 engine.io 中的 cookie 是安全的:

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

这现在打破了我在原始问题中包含的 authorization 函数,特别是这一行:

var sessionKey = socket.server.engine.cookie;

因为我不再将 cookie key 传递给 socket.io/engine.io,所以我需要直接从我的配置中读取:

var sessionKey = config.server.sessionKey;

关于node.js - 为什么 socket.io 使用不同的路径创建第二个 'sid' cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27337045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com