来自 socket.io 的新 cookie 值不起作用?

Posted

技术标签:

【中文标题】来自 socket.io 的新 cookie 值不起作用?【英文标题】:new cookie value from socket.io doesn't work? 【发布时间】:2012-06-02 10:29:28 【问题描述】:

我尝试将 socket.io id 用于多个浏览器窗口/页面。 用于使用everyauth的SNS-auth-process,项目基于express。

这是我的项目设计:

维护 socket.io 连接的完整 ajax 主页。无需重新加载,无需重定向等。

当用户尝试通过某个 SNS 帐户登录时,会打开一个弹出窗口,该窗口将由everyauth 和 SNS Auth 管理。在弹出窗口内部,会发生许多重定向,但主窗口是持久的,socket.io 连接也是如此。

最后,授权成功后,everyauth在弹窗中重定向'authdone.html'。

在浏览器上,这个弹窗已经没用了,所以window.close();

但是,可以通过everyauth获得成功的登录信息,但就我而言,cookie更重要,因为我并不完全需要使用express框架的会话管理,因为我打算做的是会话管理通过socket.IO

app.get('*',
    function (req, res)
     
        console.log("----------get------------");
        console.log(req.url);
        if (req.url == '/public/authdone.html')
        
            console.log("----------get /public/authdone.html------------");
            console.log(req.cookies);  
            // express(connect) sessionID(sid) cookie available here.
            // 'connect.sid': '2DLlayNx90wtTsyeq5w83N9g.Kc1ZFd8I7omf6u4fk4FFyKAt4dP1V6IufSf1ZtRudVI' 
        
        onreq(req, res);
    );

目前,我设法通过重定向到登录页面(/public/authdone.html)的弹出窗口上的cookie获得了快速会话ID,但这还不够。 我还需要在 cookie 中获取面向 socket.IO 的 ID。

其实我这里弄糊涂了,问了一个问题。 Adding a cookie value on Socket.IO

感谢 Wes,我稍微找到了一种添加新 cookie 值的方法(在我的例子中,是一些套接字客户端 ID),如下所示:

io.configure(function ()

    io.set('authorization', function (handshake, callback)
    
        if (handshake.headers.cookie)
        
            var cookie = handshake.headers.cookie;
            var newS = ";" 
                + "socketClientID" + "=" 
                + "999999999999999";// eventually randomize for every client
            cookie += newS;
            console.log("=========================================");
            console.log(cookie);  
         else
        
            return callback('Cookie not found', false);
        
        callback(null, true);
    );
);

在这个块中,我添加了一个 cookie 值作为 "socketClientID=999999999999999"

所以当前通过console.log输出的cookie是

connect.sid=fc2iTJW3ETD7nIyxI5ZwpayK.S0qGhp1Ryw7Msg2r03yB6g822qVZIZTbZyWUSpQL0aU;
socketClientID=999999999999999

到目前为止,一切都很好,但是,在everyauth 重定向页面上, 我还是得到了

----------get /public/authdone.html------------  
 'connect.sid': 'fc2iTJW3ETD7nIyxI5ZwpayK.S0qGhp1Ryw7Msg2r03yB6g822qVZIZTbZyWUSpQL0aU' 

只能通过cookie获取express sessionID(connect.sid),socket.IO握手阶段添加clientID cookie值不体现。

我真的需要帮助。谢谢。

【问题讨论】:

【参考方案1】:

好的,我发现我需要从客户端配置这种cookie。

emit socketClientID from io.sockets.on('connection', function (client)...

或者

从客户端发出并回调socketClientID。

我用 https://github.com/carhartl/jquery-cookie 用于客户端 Cookie 管理。

【讨论】:

以上是关于来自 socket.io 的新 cookie 值不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 socket.io 解析 cookie

node.js + express.js + socket.io 授权:没有cookie

我可以从 Socket.io 访问 cookie 吗?

Socket.io 安装抛出 Missing required argument 错误

无法从带有 Socket.IO 的 cookie 中获取 Express 会话 ID

如何对使用 cookie 的 socket.io 中间件进行单元测试