Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用套接字安全地实现通知系统?_Node.js_Mongodb_Sockets_Redis_Notifications - Fatal编程技术网

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

Node.js 如何使用套接字安全地实现通知系统?,node.js,mongodb,sockets,redis,notifications,Node.js,Mongodb,Sockets,Redis,Notifications,我目前正在使用MEAN stack开发一个web应用程序。它有一个社交方面,所以我希望能够向用户推送通知 我现在这样做的方式是,当发生某件事情时,它应该是一个通知,它被存储在一个带有未读标志的mongo数据库中。每个客户机将每30秒向服务器发送一个get请求,并将收到标记为未读的每个通知,然后将其标记为已读 我想切换到使用消息队列和套接字,这样将使用更少的网络资源,并为用户提供实时体验。我曾考虑过使用redis及其pubsub结构,但我似乎不知道如何安全地做到这一点。如果我向受影响的用户发送通知

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

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

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

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

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


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

您可以为此使用RabbitMQ。还有身份验证。请通过以下链接并尝试

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


RabbitMQ似乎是我一直在寻找的解决方案。我将尝试在应用程序中实现它。非常感谢。它将提供所有的解决方案。。实时、安全和订阅。哪个星球上有即时消息队列?即使是订阅,我们也在谈论即时性,因为订阅给您的唯一保证是,一旦有消息可用,您就会收到通知,这可能是在消息发送的时间附近,也可能不是在消息发送的时间附近。我不敢苟同。默默无闻的安全被认为已经过时了大约130年。身份验证和授权之所以被视为最佳实践,有一个原因:您可以肯定地确保通信合作伙伴(主体)实际上就是他声称的那个人,并检查该特定主体是否被授权在资源上执行请求的操作。由于只有一些难以猜测的通信渠道,你永远无法半信半疑谁会看到你的数据。我完全同意“通过模糊实现安全”这件事不够好。我不知道为什么我强调socketIDs是无用的。据我所知,使用socket.io,客户端无法“订阅”另一个套接字id。它只是服务器端的一个内部id,用于跟踪各个套接字。不过,感谢您的评论,我将更改我的答案,以便更清楚。