我使用的是Meteor 1.10+mongodb。
我有多个手机聊天&信息应用程序。
这些移动应用程序是使用Meteor DDP库本地开发的。
但我的所有应用程序都有相同的用户基础。
现在,我想在单独的服务器上创建一个单独的流星实例,以保持用户群的集中。
我需要建议,我如何才能实现这一建筑流星。
牢记反应性和性能。
对于具有完全响应功能的集中式用户群,您需要一个授权服务器,您的应用程序(=资源服务器)将使用该服务器来允许经过身份验证/授权的请求。这基本上就是OAuth2的三层工作流。
参见:
https://www.rfc-editor.org/rfc/rfc6749
https://www.oauth.com/
登录服务
为了避免DDP.connect
,您还必须编写自己的登录处理程序(Meteor.loginWithMyCustomAuthServer
),因为您必须管理两个用户库(一个用于应用程序本身,一个用于授权服务器),这将变得非常混乱。
在Oauth2授权请求成功后,此登录处理程序将检索用户帐户数据,这将使授权服务器的用户基础成为您注册的任何应用程序的单一事实点(请参阅Oauth2关于clientId
和secret
的工作流)。
向用户分账
Auth服务器是您在那里创建、更新或删除用户的单一事实点,成功登录后,您的本地应用程序将始终从该帐户同步最新的用户数据Auth服务器(Meteor也是这样使用loginWith<Service>
的)
然后,您向用户订阅应用程序本身,而无需任何ddp远程连接。当然,只有当你想要获得的用户数据实际上是针对在线用户时,这才有效。
如果您想订阅任何用户(数据可能尚未同步),您仍然需要远程订阅Authorizazion服务器上的发布。
请注意,为了使用此远程订阅对用户进行身份验证,您需要经过身份验证的DDP请求(下面的包也支持该请求)。
实施
警告-以下是我自己的一个实现。这是因为我面临过同样的问题,在我之前没有发现其他实施。
有一个完整的工作帐户服务器(但一直在进行中)
https://github.com/leaonline/leaonline-accounts
它使用了一个Oauth2-nodejs实现,该实现被封装在Meteor包中:
https://github.com/leaonline/oauth2-server
并且还创建了相应的登录处理程序:
https://github.com/leaonline/meteor-accounts-lea
所以我终于找到了解决办法。这可能不是处理这个问题的完美方法,但据我所知,它对我来说效果很好。但是的,我仍然愿意接受建议。
目前,我有4个连接应用程序,它们依赖于相同的用户群。
因此,我决定构建SSO(用于管理用户数据库的集中式服务器)
所有4个连接应用程序ping SSO进行用户身份验证并获取用户相关数据。
现在,这4个连接应用程序都是使用Meteor开发的。
这里的主要挑战是让事情变得被动/实时。例如聊天/消息,群组创建,显示用户列表&新注册用户的侦听器。
所以在这个场景中,用户数据库在其他远程服务器(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那些Api(在连接应用程序上),并在有效负载中发送插入的userId。
因此,现在那些连接的应用程序从订阅接收onDataChanged
ping并获取userId。
使用该userId,连接应用程序将ping回SSO,并获取该特定userId的用户详细信息,并准备进入用户列表。
这就是我的工作方式,所以现在我只是标记我的答案被接受了,但正如我上面提到的:"这可能不是处理这个问题的完美方法,但据我所知,它对我很有效。但是的,我仍然愿意接受建议。">
特别感谢@Jankapunkt帮助我。