2011-08-11 27 views
0

在配置一个socket.io服务器中,我有以下代码从头中的cookie获取会话ID,我想验证会话是否对应与一个登录用户(我使用express作为http服务器,并使用MemoryStore来存储会话)。无法从cookie中使用websockts与socket.io连接的会话ID

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的这个工作,但是当我从Chrome的连接,它使用的WebSockets失败。它不起作用的原因是,当客户端代码连接到套接字时,Chrome根本不会在头中发送cookie。

有没有办法让Chrome浏览器通过WebSockets发送cookie?

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

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

感谢您的帮助!

+0

保存自己一个忙,使用http://nowjs.com/ – TiansHUo

+0

@TiansHUo我期待到nowjs,谢谢你的提示!你知道我可以如何在每个连接上找到connect.sid吗? – Evan

回答

0

不熟悉Chrome的特定行为。然而,很难保证你将得到一个像Flash套接字这样的cookie,而socket.io可能会重新使用它。

但是,您可以在连接时使用类似https://github.com/carhartl/jquery-cookie或仅通过javascript(例如document.cookie)访问cookie的方式手动通过socket.io连线发送会话标识。无论交通如何,你都可以保证这样。

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