我必须创建 2 个应用程序。一个应用程序是使用express.js 和socket.io 的服务器。第二个应用程序是一个简单的客户端(静态 html+js 文件),不得从服务器express.js 实例提供服务。用于建立 session 的cookieexpress.sid
仅在访问express.js路由时创建。
当我使用 socket.io 从客户端(即 http://client.addr )连接到服务器(即 http://server.addr:0000 )时,出现问题 - 我无法建立express.js session ,因为我没有访问服务器路由并且没有 express.sid
session cookie。
我最终让客户端尝试向服务器 /set-session-cookie
路由发送 AJAX 调用,希望能够识别 session ,用加密的 sessionID
发回 cookie,然后启动 socket.io 连接 Hook 到先前调用中创建的 session ,但在 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');
第二个想法是仅发回包含加密 session ID 的字符串并使用 JS 创建 cookie,但我无法找出 res.cookie('express.sid2', req.sessionID, {signed: true});
的加密算法是什么来手动执行此操作。
这种方法有效吗?如果有其他方法可以实现此目的,请告诉我。 TIA。
最佳答案
出于安全原因,恕我直言, session cookie 应该是 HTTP-Only。 这意味着此 cookie 没有脚本支持。
您可以避免 Same-Origin-Policy通过使用 nginx 提供静态文件并反向提供问题 proxy node.js app behind nginx 。这样,所有内容都来自一台服务器,并且共享 cookie/ session ID 时不会出现问题。
据我所知 Apache httpd 无法代理 WebSocket 调用。
替代 nginx 的另一种可能的解决方法可能是 HAProxy .
关于node.js - express.js + socket.io - 如何从客户端应用程序初始化服务器上的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19763300/