如何使用套接字安全地实现通知系统



我目前正在使用MEAN堆栈开发一个web应用程序。它有社交方面,所以我希望能够向用户推送通知。

我现在的做法是,当发生应该是通知的事情时,它会被存储在带有未读标志的mongo数据库中。每个客户端将每30秒向服务器发送一个get请求,并接收标记为未读的每个通知,然后将其标记为已读。

我想切换到使用消息队列和套接字,这样将使用更少的网络资源,并为用户提供实时体验。我曾考虑过使用redis及其pubsub结构,但我似乎不知道如何安全地做到这一点。如果我向受影响的用户发送通知,恶意用户订阅别人的频道并接收不适合他们的通知不是很容易吗?我是遗漏了什么,还是对这样一个系统来说这是错误的方法?

编辑:如果其他人读到这篇文章也有同样的问题,我会更新我使用的解决方案。

我认为一个更简单、更优雅的解决方案是只使用socket.io,而不是像答案所建议的那样使用rabbitmq.当新的套接字连接到服务器时,我会在内存中的redis数据库中保存从userID到socketId的映射。(在我验证了他们的令牌之后)这样,如果我需要向用户推送通知,我只需在redis DB中查找socketId,然后将其发送到正确的套接字。这样,我就不需要任何安全性,因为socketID是不可访问的,并且消息只通过属于给定用户的单个套接字发送

这样,它将只通过给定套接字的连接发送,因为套接字ID只用于服务器端跟踪所有连接。这意味着没有其他人可以使用别人的socketID"监听"。

您可以使用RabbitMQ来实现这一点。身份验证也在那里。请浏览以下链接并尝试。

https://www.rabbitmq.com/access-control.html

此外,您可以在现有结构中使用订阅身份验证令牌仅对所有订阅用户应用身份验证。即使是redis也有其主题的安全性。请查看下面的链接

https://redis.io/topics/security

最新更新