express.js + socket.io - 如何从客户端应用程序初始化服务器上​​的会话

时间:2013-11-04 07:25:39

标签: node.js express socket.io

我必须创建2个应用程序。一个应用程序是使用express.js和socket.io的服务器。第二个应用程序是一个简单的客户端(静态html + js文件),不能从服务器express.js实例提供。只有在访问express.js路由时,才会创建用于建立会话的cookie express.sid

当我使用socket.io从客户端(即http://client.addr)连接到服务器(即http://server.addr:0000)时,我的问题就出现了 - 我无法建立express.js会话因为我没有访问服务器路由而且我没有express.sid会话cookie。

我最终客户端尝试向服务器/set-session-cookie路由发送AJAX呼叫,希望我能识别会话,发送回加密sessionID的cookie,然后启动socket.io连接挂接到会话是在之前的调用中创建的,但是在AJAX调用之后没有发回cookie。

服务器路由:

app.all('/set-sesion-cookie', function(req, res){
    res.header('Access-Control-Allow-Origin', req.headers.origin);
    res.header('Access-Control-Allow-Credentials', 'true');
    res.cookie('express.sid2', req.sessionID, {signed: true});
    res.send(200);
});

客户来电:

$.post('http://127.0.0.1:3000/set-sesion-cookie');

第二个想法是仅发回包含加密会话ID的字符串并使用JS创建cookie但我无法找出res.cookie('express.sid2', req.sessionID, {signed: true});手动执行加密算法的内容。

这种方法有效吗?如果还有其他方法可以实现这一点,请告诉我。 TIA。

1 个答案:

答案 0 :(得分:1)

出于安全原因,IMHO会话cookie应仅限HTTP。 这意味着此cookie没有脚本支持。

您可以通过提供w / nginx和反向Same-Origin-Policy的静态文件来避免proxy node.js app behind nginx问题。这种方式都来自一台服务器,您在共享cookie / session-id时没有问题。

AFAIK Apache httpd无法代理WebSocket调用。

另一种可能的解决方法,而不是nginx,可能是HAProxy