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

标签 node.js mongodb sockets redis notifications

我目前正在使用 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 也有其主题安全性。请查看下面的链接

https://redis.io/topics/security

关于node.js - 如何使用套接字安全地实现通知系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47287834/

相关文章:

javascript - 带有 socket.io 的 Nodejs 集群失去连接

node.js - 运行grunt/启动server.js时出错

javascript - JS。原型(prototype)奇怪行为中的属性

node.js - <w> [webpack.cache.PackFileCacheStrategy] 包 : Error: Unable to snapshot resolve dependencies 的缓存失败

mongodb - 在 mongodb 中检索数组中的位置

java - Apache Commons FTPClient.storeFile()错误原因:java.net.SocketException:连接重置

javascript - 为什么过滤方法不删除数组的所有元素?

mysql - 在 mysql 中更新触发器后触发并将该数据插入 mongodb

c# - 如何将 List<T> 转换为 BsonArray 以保存 MongoDB 文档

c - http c 客户端套接字中的 301/302 错误