【问题标题】:A Case of Socket IO authentication using Passport with Node-Express and MongoDB使用 Passport 和 Node-Express 和 MongoDB 的 Socket IO 认证案例
【发布时间】:2017-01-05 08:13:42
【问题描述】:

这是我的设置 -

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

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

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

Server 3 - 运行服务提供者应用程序。

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

所以我有 -

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

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

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

每种类型的用户通过使用不同的客户端应用程序连接到各自的服务器来登录到自己的 nodejs 应用程序。

例如 Admin User 连接到 Server 2 并登录管理应用程序。

使用登录护照,会话存储在 Mongo db 中,使用 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 指定的频道上发出通知,以便如果服务提供者在线,他会立即在其客户端应用程序上收到通知。

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

【问题讨论】:

    标签: node.js mongodb session socket.io passport.js


    【解决方案1】:

    根据您的帖子,我假设您使用的是 express、express-session 和 socket.io

    您可以向您的 socket.io 添加一个中间件,将您的快速会话链接到您的 socket.io 套接字。

    这里的 expressSessionMiddleware 是“express-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

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2014-10-18
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 2022-01-08
      • 2021-04-29
      • 2016-08-06
      相关资源
      最近更新 更多