如何获取 SockJS 连接的(Express 的)sessionID

Posted

技术标签:

【中文标题】如何获取 SockJS 连接的(Express 的)sessionID【英文标题】:How can I get (Express's) sessionID for a SockJS connection 【发布时间】:2015-04-05 20:55:20 【问题描述】:

我在 Express 服务器上使用 SockJS。有什么方法可以获取客户端的关联 HTTP 会话 ID?

我看到有一种方法可以为原始 web socket 和 Socket.io 执行此操作,但我正在努力寻找如何为 SockJS 执行此操作。

这就是我的服务器的样子。我想要一个类似的处理程序来获取会话 ID:

var sockjs_echo = sockjs.createServer(sockjs_opts);
sockjs_echo.on('connection', function(conn) 
    conn.on('data', function(message) 
        conn.write(message);
    );
);

【问题讨论】:

如果您使用 redis 来管理您的会话,我们的团队编写了一个可能会有所帮助的库。 npmjs.com/package/node-token-sockjs。该库将在连接时将会话与套接字相关联,并将在所有 RPC 或发布-订阅操作上公开它。 【参考方案1】:

这是一个“黑客”,但它对我有用:

sockjs_echo.on('connection', function(conn) 

        var cookieHeader = conn._session.recv.ws._stream._readableState.pipes._driver._request.headers.cookie
        var cookies = 
        cookieHeader.split(';').forEach(function( cookie ) 
            var parts = cookie.split('=');
            cookies[parts.shift().trim()] = decodeURI(parts.join('='));
        );

        conn.on('data', function(message) 
            conn.write(message);
        );
    );

“cookies”变量(示例):


  "dev_cookie": "1mimec6rbcolp0ujkcbqq9pdq4uoa5v0p8a284v32tmd4q3k0qi9p4vjteoifdn9b0lsm238fghf974o9jfehfuhvm3ltrgq02ad6k0",
  "session_cookie": "s%3AjkKYPKFFT8r60rXUsVYISoOF17o49GUl.pbpu6T1%2BcdrIu5uQPRxZUYOrl5GnC179GaI5pWyR7SA",
  "other_cookie": "s%3AzRMiC3fjo4gxTXX1p2XSi_C_EydIa358.KAdP1gwtZBVfcbkmwi%2B3pa0L1pbOCzQ3lHnNEyFvvHc"

【讨论】:

【参考方案2】:

非常感谢@darwinbaisa 提出这个问题,以及 c-toesca 的回答。这是经过几天的搜索。

对于 XHR 流,cookie 位于:conn._session.recv.request.headers.cookie。

我能想到的唯一另一种方法是使快速会话cookie httpOnly: false,从而将其暴露给javascript,当然还有可能被黑客入侵,然后将其作为前缀传递回来自任何消息SockJS javascript 客户端到节点服务器。

或者在我动态编写网页响应时将 ID 分配给 javascript 变量,以便 javascript 可以访问该变量,并再次将其返回给服务器。但同样,这会暴露 ID,即使 ID 被散列或加密,它仍然可以用于从 javascript 对服务器的恶意调用。

这样的事情在节点 WS 库中变得更容易了,但我需要一个后备方案,用于受 websocket 挑战的浏览器。

【讨论】:

以上是关于如何获取 SockJS 连接的(Express 的)sessionID的主要内容,如果未能解决你的问题,请参考以下文章

Websocket - sockjs - InvalidStateError:连接尚未建立

如何从 SQL Server Express 获取连接字符串?

Spring Boot + Sockjs 客户端离线连接问题

Spring Boot Websocket 在 SockJS 客户端测试中抛出“连接被拒绝”

SockJS Java 客户端自动重新连接

在 SockJS+Spring Websocket 中,convertAndSendToUser 中的“用户”来自哪里?