使用 Passport 与 Node-Express 和 MongoDB 的 Socket IO 身份验证案例
A Case of Socket IO authentication using Passport with Node-Express and MongoDB
这是我的设置 -
三个不同的服务器运行三个不同的节点 js 应用程序在三个不同的 EC2 服务器上。
服务器 1 - 运行 主应用程序。
服务器 2 - 运行 管理应用程序。
服务器 3 - 运行 服务提供商应用程序。
每个服务器都使用相同的 MongoDB 数据库,因为它们必须共享集合。
所以我有 -
服务器 4 - 数据库服务器 - 运行 Mongo DB.
在数据库中有三个集合代表三种类型的用户 -
1] 主要用户 2] 管理员用户 3] 服务提供商
每种类型的用户通过使用不同的客户端应用程序连接到各自的服务器来登录自己的 nodejs 应用程序。
例如 管理员用户 连接到 服务器 2 并登录管理应用程序。
使用登录密码,会话存储在 Mongo 数据库中,使用 connect-mongo 。所有类型用户的所有会话都存储在 Mongo 数据库中的相同会话集合中。
问题-
现在我想用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 并获得其他用户的所有通知 user.What 我想要的是通知服务器应该查看 Mongo DB 数据库并检查连接的用户是否经过身份验证并具有正确的用户 ID。
根据您的 post 我假设您使用的是 express、express-session 和 socket.io
您可以添加一个中间件 socket.io 将您的快速会话链接到您的 socket.io 套接字。
这里的expressSessionMiddleware是"express-session"中间件的一个实例,应该和主应用中的session中间件一样配置。
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
这是我的设置 -
三个不同的服务器运行三个不同的节点 js 应用程序在三个不同的 EC2 服务器上。
服务器 1 - 运行 主应用程序。
服务器 2 - 运行 管理应用程序。
服务器 3 - 运行 服务提供商应用程序。
每个服务器都使用相同的 MongoDB 数据库,因为它们必须共享集合。
所以我有 -
服务器 4 - 数据库服务器 - 运行 Mongo DB.
在数据库中有三个集合代表三种类型的用户 -
1] 主要用户 2] 管理员用户 3] 服务提供商
每种类型的用户通过使用不同的客户端应用程序连接到各自的服务器来登录自己的 nodejs 应用程序。
例如 管理员用户 连接到 服务器 2 并登录管理应用程序。
使用登录密码,会话存储在 Mongo 数据库中,使用 connect-mongo 。所有类型用户的所有会话都存储在 Mongo 数据库中的相同会话集合中。
问题-
现在我想用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 并获得其他用户的所有通知 user.What 我想要的是通知服务器应该查看 Mongo DB 数据库并检查连接的用户是否经过身份验证并具有正确的用户 ID。
根据您的 post 我假设您使用的是 express、express-session 和 socket.io
您可以添加一个中间件 socket.io 将您的快速会话链接到您的 socket.io 套接字。
这里的expressSessionMiddleware是"express-session"中间件的一个实例,应该和主应用中的session中间件一样配置。
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