无法使用带有socket.io的websockts从cookie获取connect的会话ID

时间:2011-08-11 06:47:23

标签: javascript node.js socket.io

在socket.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-only,我在其他地方看到的可能是问题?我的理解是,删除该选项会增加您对XSS攻击的脆弱性吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

不熟悉Chrome的特定行为。但是,很难保证你会得到像Flash套接字这样的cookie,而socket.io可能会依赖它。

但是,当您使用https://github.com/carhartl/jquery-cookie之类的连接或仅通过javascript(例如document.cookie)访问cookie时,您可以使用socket.io手动通过wire.io手动发送会话ID。不管运输方式如何,你都可以保证这样。

答案 1 :(得分:0)

尝试在客户端上禁用闪存套接字和网络套接字:

        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);
            }
        );