首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么socket.io要用不同的路径创建第二个“sid”cookie?

为什么socket.io要用不同的路径创建第二个“sid”cookie?
EN

Stack Overflow用户
提问于 2014-12-06 21:57:41
回答 1查看 5.5K关注 0票数 4

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

用于“/”的"sid“cookie:

"sid“用于”/socket.io“的cookie:

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
  });
}

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

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-06 22:26:46

好吧,我想我解决了。在我的服务器上挂载cookie时,似乎提供了socket.io选项,最终导致engine.io基于这些代码行设置同名的cookie。

代码语言:javascript
复制
if (false !== this.cookie) {
  transport.on('headers', function(headers){
    headers['Set-Cookie'] = self.cookie + '=' + id;
  });
}

根据RFC-2109 HTTP状态管理机制,默认路径是当前的URL路径:

Path默认为生成Set响应的请求URL的路径,直到但不包括最右边的/。

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

代码语言:javascript
复制
var io = socketio(server, {
  cookie: false
});

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

代码语言:javascript
复制
var sessionKey = socket.server.engine.cookie;

由于我不再将cookie密钥传递给Socket.IO/Engin.io,所以我需要直接从配置中读取:

代码语言:javascript
复制
var sessionKey = config.server.sessionKey;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27337045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档