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

时间:2015-04-05 20:55:20

标签: node.js express websocket sockjs

我在Express服务器上使用SockJS。有没有办法获取客户端的关联HTTP会话ID?

我看到有一种方法可以为原始web socketSocket.io执行此操作,但我很难找到如何为SockJS执行此操作。

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



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




2 个答案:

答案 0 :(得分: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"
}

答案 1 :(得分:0)

非常感谢你提出这个问题,@ 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的浏览器中回退。