为集中用户数据库使用单独的服务器
Use separate server for centralized users database
我正在使用 Meteor 1.10 + mongodb。
我有多个移动聊天和信息应用程序。
这些移动应用程序是使用 Meteor DDP 库本地开发的。
但我所有应用的用户群都相同。
现在我想在单独的个人服务器上创建一个单独的 meteor 实例,以保持用户群集中。
我需要关于如何使用 meteor 实现此架构的建议。
牢记反应性和性能。
对于具有完整反应功能的集中式用户群,您需要一个授权服务器,您的应用程序(= 资源服务器)将使用它来允许 authenticated/authorized 请求。这基本上是 OAuth2 3 层工作流程。
参见:
https://www.rfc-editor.org/rfc/rfc6749
登录服务
您还必须编写自己的登录处理程序 (Meteor.loginWithMyCustomAuthServer
) 以避免 DDP.connect
因为您将不得不管理 两个用户群 (一个用于应用程序本身,一个用于授权服务器)这会变得非常混乱。
此登录处理程序随后会在 Oauth2 授权请求成功后检索用户帐户数据,这将使授权服务器的用户库成为您已注册的任何应用程序的单一事实点(阅读 Oauth2 工作流程clientId
和 secret
).
订阅用户
Auth 服务器是您在其中创建、更新或删除用户的单一事实点,并且在成功登录后,您的本地应用程序将始终 获取从该帐户 Auth Server 同步的最新用户数据(这也是 Meteor 使用 loginWith<Service>
的方式)
然后您可以在没有任何 ddp 远程连接的情况下为您的用户订阅应用程序本身。这当然只有当你要获取的用户数据实际上是在线用户时才有效。
如果您想订阅任何用户(数据可能尚未同步),您仍然需要远程订阅 Authorizazion 服务器上的发布。
请注意,为了使用此远程订阅对用户进行身份验证,您需要经过身份验证的 DDP 请求(也由以下包支持)。
实施
警告 - 以下是我自己的实现。这是因为我遇到了同样的问题,并且在我之前没有发现其他实现。
有一个完整的工作帐户服务器(但一直在进行中)
https://github.com/leaonline/leaonline-accounts
它使用了一个 Oauth2 nodejs implementation,它被包裹在一个 Meteor 包中:
https://github.com/leaonline/oauth2-server
并且还创建了相应的登录处理程序:
所以我终于找到了解决办法。这可能不是处理此问题的完美方法,但据我所知,它对我非常有效。但是,是的,我仍然愿意接受建议。
目前我有 4 个依赖于相同用户群的连接应用程序。
所以我决定构建 SSO(用于管理用户数据库的集中式服务器)
所有 4 个连接应用程序都 ping SSO 以进行用户身份验证并获取用户相关数据。
现在这 4 个连接应用程序是使用 Meteor 开发的。
这里的主要挑战是制作东西 Reactive/Realtime。
例如 Chat/Messaging、组创建、显示用户列表和新注册用户的听众。
因此在这种情况下,用户数据库位于其他远程服务器 (SSO) 上,因此在连接应用程序时我不能:
Meteor.publish("getUsers")
因此,在连接应用程序时,我决定创建一个名为:
的临时集合
UserReactiveCollection
具有以下结构:
UserReactiveCollection.{
_id: 1,
userId: '2',
createdAt: new Date()
}
并且我发布了订阅:
Meteor.publish("subscribeNewUserSso", function () {
return UserReactiveCollection.find({});
});
因此,为了更新 UserReactiveCollection
,我分别在每个连接的应用程序上公开了 Rest Api。
这些 api 从 SSO 接收数据并在 UserReactiveCollection
.
中更新
所以在 SSO 端,每当有新用户注册时。我 ping 那些 Apis(在连接应用程序上)并在有效负载中发送插入的 userId。
现在那些连接应用程序从订阅接收 onDataChanged
ping 并获取用户 ID。
连接应用程序使用该 userId ping 回 SSO 并获取该特定 userId 的用户详细信息并添加到用户列表中。
这就是我如何完成所有工作的,所以现在我只是将我的答案标记为已接受,但正如我上面提到的那样:"It might not be the perfect way to handle this, but to my knowledge it worked for me so well. But yes I still open for suggestions."
特别感谢@Jankapunkt 帮助我。
我正在使用 Meteor 1.10 + mongodb。
我有多个移动聊天和信息应用程序。
这些移动应用程序是使用 Meteor DDP 库本地开发的。
但我所有应用的用户群都相同。
现在我想在单独的个人服务器上创建一个单独的 meteor 实例,以保持用户群集中。
我需要关于如何使用 meteor 实现此架构的建议。
牢记反应性和性能。
对于具有完整反应功能的集中式用户群,您需要一个授权服务器,您的应用程序(= 资源服务器)将使用它来允许 authenticated/authorized 请求。这基本上是 OAuth2 3 层工作流程。
参见:
https://www.rfc-editor.org/rfc/rfc6749
登录服务
您还必须编写自己的登录处理程序 (Meteor.loginWithMyCustomAuthServer
) 以避免 DDP.connect
因为您将不得不管理 两个用户群 (一个用于应用程序本身,一个用于授权服务器)这会变得非常混乱。
此登录处理程序随后会在 Oauth2 授权请求成功后检索用户帐户数据,这将使授权服务器的用户库成为您已注册的任何应用程序的单一事实点(阅读 Oauth2 工作流程clientId
和 secret
).
订阅用户
Auth 服务器是您在其中创建、更新或删除用户的单一事实点,并且在成功登录后,您的本地应用程序将始终 获取从该帐户 Auth Server 同步的最新用户数据(这也是 Meteor 使用 loginWith<Service>
的方式)
然后您可以在没有任何 ddp 远程连接的情况下为您的用户订阅应用程序本身。这当然只有当你要获取的用户数据实际上是在线用户时才有效。
如果您想订阅任何用户(数据可能尚未同步),您仍然需要远程订阅 Authorizazion 服务器上的发布。
请注意,为了使用此远程订阅对用户进行身份验证,您需要经过身份验证的 DDP 请求(也由以下包支持)。
实施
警告 - 以下是我自己的实现。这是因为我遇到了同样的问题,并且在我之前没有发现其他实现。
有一个完整的工作帐户服务器(但一直在进行中)
https://github.com/leaonline/leaonline-accounts
它使用了一个 Oauth2 nodejs implementation,它被包裹在一个 Meteor 包中:
https://github.com/leaonline/oauth2-server
并且还创建了相应的登录处理程序:
所以我终于找到了解决办法。这可能不是处理此问题的完美方法,但据我所知,它对我非常有效。但是,是的,我仍然愿意接受建议。
目前我有 4 个依赖于相同用户群的连接应用程序。
所以我决定构建 SSO(用于管理用户数据库的集中式服务器)
所有 4 个连接应用程序都 ping SSO 以进行用户身份验证并获取用户相关数据。
现在这 4 个连接应用程序是使用 Meteor 开发的。
这里的主要挑战是制作东西 Reactive/Realtime。 例如 Chat/Messaging、组创建、显示用户列表和新注册用户的听众。
因此在这种情况下,用户数据库位于其他远程服务器 (SSO) 上,因此在连接应用程序时我不能:
Meteor.publish("getUsers")
因此,在连接应用程序时,我决定创建一个名为:
的临时集合UserReactiveCollection
具有以下结构:
UserReactiveCollection.{
_id: 1,
userId: '2',
createdAt: new Date()
}
并且我发布了订阅:
Meteor.publish("subscribeNewUserSso", function () {
return UserReactiveCollection.find({});
});
因此,为了更新 UserReactiveCollection
,我分别在每个连接的应用程序上公开了 Rest Api。
这些 api 从 SSO 接收数据并在 UserReactiveCollection
.
所以在 SSO 端,每当有新用户注册时。我 ping 那些 Apis(在连接应用程序上)并在有效负载中发送插入的 userId。
现在那些连接应用程序从订阅接收 onDataChanged
ping 并获取用户 ID。
连接应用程序使用该 userId ping 回 SSO 并获取该特定 userId 的用户详细信息并添加到用户列表中。
这就是我如何完成所有工作的,所以现在我只是将我的答案标记为已接受,但正如我上面提到的那样:"It might not be the perfect way to handle this, but to my knowledge it worked for me so well. But yes I still open for suggestions."
特别感谢@Jankapunkt 帮助我。