2

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

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

我最终让客户端尝试向服务器/set-session-cookie路由发送 AJAX 调用,希望我可以识别会话,发送回加密的 cookie,sessionID然后启动 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。

4

1 回答 1

1

出于安全原因,恕我直言会话 cookie 应该是 HTTP-Only。这意味着该 cookie 没有脚本支持。

您可以通过在 nginx 后面提供带有 nginx 和反向代理 node.js 应用程序的静态文件来避免Same-Origin-Policy问题。这样一来,所有内容都来自一台服务器,您在共享 cookie/会话 ID 时不会遇到问题。

AFAIK Apache httpd 无法代理 WebSocket 调用。

替代 nginx 的另一种可能的解决方法可能是HAProxy

于 2013-11-04T11:11:56.887 回答