如何处理 Socket.io 和 Express 的会话?

Posted

技术标签:

【中文标题】如何处理 Socket.io 和 Express 的会话?【英文标题】:How to handle sessions with Socket.io and Express? 【发布时间】:2015-04-30 21:11:21 【问题描述】:

我有一个应用程序正在运行。用户要求在他们登录后他们会在以后回来时保持登录状态。

我知道我需要以某种方式在客户端存储会话数据,例如 cookie。我试过这个https://***.com/a/25618636/2440515,但它不起作用。这https://www.npmjs.com/package/socket.io-handshake

我有最新版本的 Express 和 Socket.io。

我的应用程序使用 Socket.io 进行身份验证,因此我需要一种从 Socket.io 回调更新 cookie 的方法。我花了最后 4 小时搜索和尝试不同的解决方案。有人可以给我一个提示吗?

谢谢!

【问题讨论】:

您能否详细介绍一下您的应用程序的架构? Express 和 Socket.io 的作用是什么?无论如何,你有没有想过用 JWT 来做呢?您可以使用 html Web Storage 将令牌保存在浏览器中,将其附加到后续的 Express 请求中,然后使用中间件对其进行验证。 好的,我最终编写了加密的 cookie 客户端,然后解码和读取会话数据服务器端。 很高兴你解决了它。无论如何,您都应该检查一下,因为 jwt 正在成为 node.js 身份验证的规范:sitepoint.com/using-json-web-tokens-node-js 这个链接可以帮到你***.com/questions/15169418/… 【参考方案1】:

您可以使用 coockie 模块来解析传递的 cookie:

$ npm install cookie

关于代码:

//...
var cookie = require('cookie');
//...
io.use(function (socket, next) 
   var cookies = cookie.parse(socket.request.headers.cookie);

   var my_secret = cookies.my_secret || null;

   if (!my_secret) 
       return next(new Error('No cookie set'));
   

   validateMySecretAsync(my_secret, next);

);
// ....

【讨论】:

嘿,我看到了你的回答,我认为它类似于:***.com/a/25921668/2440515。请看看它非常简单。我之前尝试过并且已经拥有所有代码。我仍然不知道如何将数据保存到 cookie。我可以将数据附加到 socket.handshake.session 但它不会持续存在。 您是否使用 express 创建 cookie? 好的,我最终编写了加密的 cookie 客户端,然后解码和读取会话数据服务器端。 你不需要使用加密的cookie,你必须发送一个类似字符串的令牌。我建议您不要在应用程序级别设置安全性,而是使用高级协议作为 SSL。您可以使用基于盐的哈希生成令牌,例如“sha1(user_id + salt)”并使用这些进行验证。 我做到了,我将加密 (JWT) 会话令牌作为字符串发送,并将其保存为 cookie。我将很快研究 HTTPS 和 SSL。我的应用落后于 HAProxy 和 Phusion Passenger(Apache 版本)。

以上是关于如何处理 Socket.io 和 Express 的会话?的主要内容,如果未能解决你的问题,请参考以下文章

socket.io-redis 如何处理房间?

socket.io:如何处理 4000 个用户?

如何处理 JSON 响应

如何处理 io.use 中间件来捕获客户端上的错误?

Node.JS、Express 和 Heroku - 如何处理 HTTP 和 HTTPS?

Express 和 React Routes 如何处理来自浏览器的初始 GET 请求?