2016-08-29 64 views
0

插槽IO认证的情况下,这是我的设置 -使用Passport与节点-Express和MongoDB的

三种运行三个不同节点的js在三个不同的EC2服务器应用不同的服务器。

服务器1 - 正在运行的主应用程序。

服务器2 - 正在运行管理员应用程序。

服务器3 - 运行服务提供商应用程序。

每个服务器都使用相同的MongoDB数据库,因为它们必须共享集合。

所以我有 -

服务器4 - 数据库服务器 - 运行蒙戈DB。

在数据库有代表三个类型的用户三个集合 -

1]主要用户2]管理员用户3]服务提供商

每种类型的用户登录到他自己的NodeJS应用通过连接到各自的服务器使用不同的客户应用

例如管理员用户连接到服务器2并登录到管理应用程序。

对于使用登录护照,会话存储在Mongo数据库中,使用connect-mongo。所有类型用户的所有会话都存储在Mongo DB中的相同会话集合中。

的问题 -

现在我想用socket.io实行通报制度。每种类型的用户在其模型中都有一个通知子文档数组。事情是这样的 -

主要用户模式

   { 
       .... 

       notifications : [{ text : String , date : Date}] 

       } 

管理员用户架构

   { 
       .... 

       notifications : [{ text : String , date : Date}] 

       } 

服务提供商架构

   { 
       .... 

       notifications : [{ text : String , date : Date}] 

       } 

如果主用户书特定服务提供商的服务,首先服务预订信息将被存储,然后通知将被放入服务器副提供者通知数组。现在,如果服务提供商在线,则应将通知推送给服务提供商客户端应用程序。

为此,我试图使用Socket.io。

我的做法

设置推送新服务器的通知 -

服务器5 - 通知服务器。

该服务器运行一个socket.io服务器。当任何类型的用户使用相应的客户端应用程序登录到各个节点js应用程序时,他也会在成功登录后连接到此通知服务器。

现在,当MainUser预订特定服务提供者的服务时,主服务器应用程序会将通知放入其文档中的特定服务提供者通知数组中。之后,它会向通知服务器发送一个请求,以在由服务提供商的ID指定的通道上发出通知,以便如果服务提供商处于联机状态,他会立即在其客户端应用程序上收到通知。

但是,如何确保连接到我的套接字io服务器的用户是合法的。如果有任何用户可以连接到套接字IO服务器并监听其他用户的频道,如果他以某种方式获得其他用户的ID并获得所有其他用户的通知。我想要的是通知服务器应该查看MongoDB数据库中的会话集合并检查连接的用户是否已通过身份验证并具有适当的用户标识。

回答

0

从你的文章中,我假设你使用快递,快递会话和socket.io

你socket.io你Express会话链接到你的socket.io插座可以添加中间件。

expressSessionMiddleware这里是“快速会话”中间件的实例,它应该与主应用程序中的会话中间件完全相同地配置。

socketio = require "socket.io" 
io  = socketio() 

io.use (socket, next) -> 
    expressSessionMiddleware socket.handshake, {}, next 

然后,您将有机会获得会议socket.handshake.session

,做这方面的例子模块可以在这里找到:https://github.com/xpepermint/socket.io-express-session

相关问题