我必须创建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。
答案 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。