我目前正在使用 MEAN 堆栈开发 Web 应用程序。它具有社交方面的功能,因此我希望能够向用户推送通知。
我现在的做法是,当某件事发生时,它应该是一个通知,它被存储在一个带有未读标志的 mongo 数据库中。每个客户端将每 30 秒向服务器发送一个获取请求,并将收到标记为未读的每个通知,然后将其标记为已读。
我想改用消息队列和套接字,这样可以减少网络资源的使用,同时为用户提供实时体验。我考虑过使用 redis 及其 pubsub 结构,但我似乎无法弄清楚如何安全地执行此操作。如果我向受影响的用户推送通知,恶意的人是否很容易订阅其他人的 channel 并收到不适合他们的通知?我是否遗漏了什么,或者对于这样的系统来说这只是错误的方法?
编辑:如果其他阅读本文的人遇到同样的问题,我会更新我使用的解决方案。
而不是使用 rabbitmq,正如答案所建议的那样,我认为一个更简单和优雅的解决方案是只使用 socket.io。当新套接字连接到服务器时,我将一个从 userID 到 socketId 的映射保存在 redis 内存数据库中。 (在我验证了他们的 token 之后)这样,如果我需要向用户推送通知,我只需在 redis 数据库中查找 socketId,然后将其发送到正确的套接字。
除此之外我不需要任何安全性,因为 socketID 是不可猜测的,并且消息仅通过属于给定用户的单个套接字发送。
这样它只会通过给定套接字的连接发送,因为 socketID 仅在服务器端用于跟踪所有连接。这意味着没有其他人可以使用其他人的 socketID 来“监听”。
最佳答案
您可以为此使用 RabbitMQ。还有身份验证。请通过以下链接尝试。
https://www.rabbitmq.com/access-control.html
此外,您可以使用订阅授权 token 在现有结构中仅对所有订阅用户应用身份验证。 即使是 Redis 也有其主题安全性。请查看下面的链接
关于node.js - 如何使用套接字安全地实现通知系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47287834/