【问题标题】:Getting SessionID During Socket.io Authorization?在 Socket.io 授权期间获取 SessionID?
【发布时间】:2019-09-04 05:07:15
【问题描述】:

当新的 WebSocket 连接来自用户时,我正在尝试从 express-session 获取 sessionID。我能找到 sessionID,我只是对它的格式有疑问。

当我向我的信使页面发出 HTTP 请求时说我得到“X”作为 sessionID,如果我随后建立了 WebSocket 连接,我可以找到会话 ID“AXB”,会话 ID X 在那里,而且被其他信息包围。

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var session = require('express-session');
var io = require('socket.io')(server);

var store = new MemoryStore({
  checkPeriod: 86400000
});

app.use(session({
  store: store,
  secret: 'jpcs-0001080900DRXPXL',
  saveUninitialized: false,
  resave: true
}));

// ...

app.get('/messenger/:uid', authorizationRedirect, (req, res) => {

  console.log(req.sessionID);
  // prints "EIVUudPTckmojrkv6FN9Cdb5NAQq5oQU"

  // ...
});

io.set('authorization', (data, accept) => {

  if (data && data.headers && data.headers.cookie) {

    console.log(data.headers.cookie);

    cookies_str = data.headers.cookie;
    cookies_arr = cookies_str.split(';');
    cookies = {};

    for (index in cookies_arr) {
      cookie = cookies_arr[index].split('=');
      key = cookie[0].replace(/ /g,'');
      val = cookie[1];
      cookies[key] = val;
    }

    sessionId = cookies['connect.sid'].split('.')[0];
    console.log(sessionId);
    // prints "s%3AEIVUudPTckmojrkv6FN9Cdb5NAQq5oQU.AQkvP..."

    // ...

});

所以基本上,在io.set('authorization', ...) 我得到:

s%3AEIVUudPTckmojrkv6FN9Cdb5NAQq5oQU.AQkvPsfoxieH3EAs8laFWN28dr1C%2B9zIT%2BMXtKTRPBg

但是在app.get('/...', ...) 我得到:

EIVUudPTckmojrkv6FN9Cdb5NAQq5oQU

您会注意到来自 socket.io 的字符串确实包含以下格式的会话 ID:"s%3A" + sessionID + ".xxxxxxxxxxx..."

显然我可以从这里获取 sessionID,但我很好奇为什么当我获得套接字连接时 sessionID 会这样显示?无论浏览器、WebSocket 实现等如何,它总是会这样显示吗?包含的其他信息是什么意思?我主要想确保这是获取 sessionID 的可靠方法。谢谢!

【问题讨论】:

    标签: express session cookies socket.io express-session


    【解决方案1】:

    我首先想澄清io.set('authorization',...) 已被弃用。这是更新版本Documentation

    显然我可以从这里获取 sessionID,但我很好奇为什么当我获得套接字连接时 sessionID 会这样显示?无论浏览器、WebSocket 实现等如何,它是否总是这样显示?

    它根本不是为套接字连接保留的。这就是它在浏览器上的固定方式。所以是的,它会一直这样显示。

    包含的其他信息是什么意思?我主要想确保这是获取 sessionID 的可靠方法。 (s%3AEIVUudPTckmojrkv6FN9Cdb5NAQq5oQU.AQkvPsfoxieH3EAs8laFWN28dr1C%2B9zIT%2BMXtKTRPBg)

    前三个字符只是编码,我相信每个 sessionID 都包含它。 DecodedURIComponent("s%3A") = "s:"

    之后是 sessionID 本身 (EIVUudPTckmojrkv6FN9Cdb5NAQq5oQU)

    现在,点 (AQkvPsfoxieH3EAs8laFWN28dr1C%2B9zIT%2BMXtKTRPBg) 之后是签名部分。这验证了 cookie 的真实性,并且实际上是在您签署 cookie 时给出的。是的,我会说这是一种值得信赖且可靠的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-19
      • 2021-05-16
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2017-08-02
      相关资源
      最近更新 更多