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

标签 node.js express socket.io

我必须创建 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/

相关文章:

mysql - SELECT 在 Node.js 中不起作用

node.js - 导出CSV文件,并通过浏览器下载,使用express js

node.js - ExpressJS - 使用基于参数的路由和绝对路由

node.js - NodeJs 中的中间件总是重定向到同一页面(我猜)

javascript - 更改socket.on中的变量

Node.js Mongodb 两个不同用户在同一时间进行两次预订。只有一个人可以预订

node.js - 如何使用 Node 通过摘要身份验证发布消息?

javascript - 编写commonjs模块并使用require加载它(不使用相对路径)

ruby-on-rails-3 - 直接从 Rails 应用程序向 Node.js 和 Socket.io 推送服务器发送消息

javascript - NodeJS : client. 发出 ('message' )连接后需要延迟才能被看到