【问题标题】:Why is socket.io creating a second 'sid' cookie with a different path?为什么 socket.io 会使用不同的路径创建第二个“sid”cookie?
【发布时间】:2015-02-04 20:55:37
【问题描述】:

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

“/”的“sid”cookie:

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

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

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;

【问题讨论】:

    标签: node.js session cookies express socket.io


    【解决方案1】:

    好的,我想我解决了。看起来在我的服务器上安装 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 /.
    

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

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

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

    var sessionKey = socket.server.engine.cookie;
    

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

    var sessionKey = config.server.sessionKey;
    

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多