在 socket.io 上,我是不是总是必须对每个 emit() 进行身份验证,而不仅仅是在建立连接时进行身份验证?

Posted

技术标签:

【中文标题】在 socket.io 上,我是不是总是必须对每个 emit() 进行身份验证,而不仅仅是在建立连接时进行身份验证?【英文标题】:on socket.io do I always have to authenticate with each emit() instead of just when establishing connection?在 socket.io 上,我是否总是必须对每个 emit() 进行身份验证,而不仅仅是在建立连接时进行身份验证? 【发布时间】:2019-06-10 02:01:53 【问题描述】:

我从 REST 切换到 socket.io 的原因之一是因为后者是一种无状态通信,我发现自己如果必须为每次发出的这种膨胀添加大量令牌整个交流了很多。

这是与 socket.io 进行聊天通信的主要安全标准吗?

那么,对于像 Grindr 这样的应用,最好的方法是使用 JWT 之类的每个 emmit 吗?通过护照?

干杯

【问题讨论】:

RESTful 应用程序是无状态的。是的,令牌通常最适合维护状态和身份验证 【参考方案1】:

我处理它的方式是在登录时进行一次身份验证,然后在服务器端创建一个身份验证令牌。在服务器上,我将令牌映射到用户详细信息,并且仅将用户名附加到套接字对象。我只将令牌发送给客户端一次,作为对登录的响应。然后,您想要验证用户身份的任何事件(阅读:几乎所有事件)都发送令牌并根据令牌和附加到接收消息的套接字对象的用户名验证用户服务器端。

请注意,虽然 JWT 肯定是一种标准,但使用这种方法,您不需要任何特定的令牌格式。您只需要某种唯一 ID 作为令牌,因此即使是 5 个字符的随机(但唯一!)令牌也应该没问题,不会在您的消息上留下太多多余的内容。

【讨论】:

以上是关于在 socket.io 上,我是不是总是必须对每个 emit() 进行身份验证,而不仅仅是在建立连接时进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个端口上运行 express 和 socket.io

多人游戏是不是应该总是根据每个客户端请求从数据库中请求数据?

Node.JS 寻找 socket.IO 的替代方案

Socket-IO 使用轮询而不是 Websocket

chrome 扩展背景 - socket.io 连接到 https 而不是 http

Heroku - Socket.IO 客户端总是连接到本地主机