如何处理 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 的会话?的主要内容,如果未能解决你的问题,请参考以下文章