在Socket.io授权期间获取SessionID?

时间:2019-04-13 18:10:12

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

当来自用户的新WebSocket连接进入时,我正在尝试从express-session中获取sessionID。我能够找到sessionID,我只是有一个关于其格式的问题。

当我对Messenger页面进行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%3A EIVUudPTckmojrkv6FN9Cdb5NAQq5oQU。AQkvPsfoxieH3EAs8laFWN28dr1C%2B9zIT%2BMXtKTRPBg

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

EIVUudPTckmojrkv6FN9Cdb5NAQq5oQU

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

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

1 个答案:

答案 0 :(得分:0)

我首先要澄清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时给出。是的,我会说这是一种值得信赖且可靠的方式。