我尝试将socket.io id用于多个浏览器窗口/页面。 这是使用everyauth的SNS-auth-process,项目基于express。
这是我的项目设计:
维护socket.io连接的完整ajax主页。没有重新加载,没有重定向等。
当用户尝试通过某个SNS帐户登录时,会打开一个弹出窗口,该窗口将由everyauth和SNS Auth管理。在弹出窗口中,会出现许多重定向,但主窗口是持久的,所以作为socket.io连接。
最后,在成功授权后,everyauth会在弹出窗口中重定向'authdone.html'。
在浏览器上,此弹出窗口不再有用,因此window.close();
但是,可以在整个Everyauth中获得成功的登录信息,但在我的情况下,cookie更重要,因为我不需要使用快速框架进行会话管理,因为我打算做的是会话管理通过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获取express sessionID,但是,这还不够。 我还需要在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' }
只表示sessionID(connect.sid)可以通过cookie获取,在socket上添加了clientID cookie值。不会反映握手阶段。
我真的需要帮助。感谢。
答案 0 :(得分:1)
好的,我发现我需要在客户端配置这种cookie。
从io.sockets.on发出socketClientID('connection',function(client)...
或者
从客户端发出并回调socketClientID。
我用 https://github.com/carhartl/jquery-cookie 用于客户端Cookie管理。