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

时间:2017-11-14 14:06:57

标签: node.js mongodb sockets redis notifications

我目前正在使用MEAN堆栈处理Web应用程序。它具有社交方面,所以我希望能够向用户推送通知。

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

我想切换到使用消息队列和套接字,以便使用更少的网络资源,并为用户提供实时体验。我已经考虑过使用redis及其pubsub结构,但我似乎无法弄清楚如何安全地做到这一点。如果我向受影响的用户推送通知,那么恶意的人很容易订阅其他人的频道并接收不适合他们的通知吗?我错过了什么,或者这只是错误的方法吗?

编辑:图I我使用我去过的解决方案进行更新,如果其他人阅读此内容时遇到同样的问题。

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

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

1 个答案:

答案 0 :(得分:1)

你可以使用RabbitMQ。还有认证。请仔细阅读以下链接并尝试。

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

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

https://redis.io/topics/security