使用socket.io的websockets无法从cookie中获取connection 's会话id

Unable to get connect's session id from cookie using websockts with socket.io

本文关键字:connection 获取 id 会话 cookie io socket websockets 使用      更新时间:2023-09-26

在配置套接字时。io服务器我有下面的代码,它从头部的cookie中获取会话id,我想验证会话对应于登录用户(我使用express作为http服务器,并使用MemoryStore来存储会话)。

  io.set('authorization', function (handshakeData, callback) {
    var cookies = handshakeData.headers.cookie;
    cookies = connect.utils.parseCookie(cookies);
    var sid = cookies['connect.sid'];  
    /* verify that is a valid session */
  });

当我从Firefox连接到我的node.js时,它最终使用长轮询,但当我从使用WebSockets的Chrome连接时失败。它不起作用的原因是当客户端代码连接到套接字时,Chrome根本不会在头中发送cookie。

是否有办法让Chrome通过WebSockets发送cookie ?

如果不是,我应该如何存储sessionID,以便在验证套接字连接时可以访问它?

我还应该注意到保持会话id的cookie被设置为仅http,我在其他地方看到的可能是问题?我的理解是,删除该选项会增加您对XSS攻击的脆弱性。

谢谢你的帮助!

不熟悉Chrome的特殊行为。然而,很难保证你会得到一个cookie,比如Flash socket,哪个socket。我可以依靠。

但是,您可以通过带套接字的网络手动发送会话id。IO当你连接时,使用类似https://github.com/carhartl/jquery-cookie的东西或只是通过javascript访问cookie(例如document.cookie)。无论运输方式如何,您都可以保证这样做。

尝试在客户端禁用flash套接字和web套接字:

        var socket = new io.Socket(null, {
              rememberTransport: false,
              transports: [
                  //'websocket', 
                  //'flashsocket',
                  'htmlfile',
                  'xhr-multipart',
                  'xhr-polling']
            })
        socket.on('connect',
            function() {
                console.log(arguments);
            }
        );
        socket.on('message',
            function(data) {
                console.log(arguments);
            }
        );