我正在尝试使用Passport为我的企业凭据准备好Loopback,但我遇到了一些可能我做错的事情。
首先我有2种不同类型的用户:participant
和judge
。这两个模型都有User
的基础。我现在也在使用内存数据库(最终转到Mongo)。
当我使用Passport示例作为基础时,我还定义了3个其他模型:
当我能够使用/participants/login
登录并获得accessToken作为回报时,一切似乎都很好。我也可以正常访问/participants/1
(登录用户的ID)。
现在有了相同的标记,我也可以访问/judges/1
!这似乎有点风险。现在我知道mongo我可能不会得到相同的ID,但除此之外(除非这是它应该如何工作)。
我确实尝试过混乱关系,但发现如果我在关系中做了除foreignKey: 'userId'
以外的任何事情,它将无法登录。
以下是数据库的片段:
"participant": {
"1": "{\"createdDate\":\"2016-05-16T18:37:38.956Z\",\"name\":\"Participant Weed\",\"pin\":\"N0148094\",\"awaitingTeam\":true,\"videoSigned\":false,\"password\":\"$2a$10$NgIjGMEPUvmworA/C0vTiu2lA52SQqR6QXkOwh8IfJWVJBF8izDAu\",\"email\":\"t@lm.com\",\"id\":1}",
"2": "{\"createdDate\":\"2016-05-16T18:37:38.956Z\",\"name\":\"Other Participant Weed\",\"pin\":\"N0148094\",\"awaitingTeam\":true,\"videoSigned\":false,\"password\":\"$2a$10$joljfw98Lf.3qdnIwf55nOEotAE3Zrcr97Fe5XKPE7j1PFy5O2h5.\",\"email\":\"t2@lm.com\",\"id\":2}"
},
"judge": {
"1": "{\"createdDate\":\"2016-05-16T18:37:38.956Z\",\"name\":\"Judge Weed\",\"pin\":\"N0148094\",\"password\":\"$2a$10$ZiCmsGos3t7UYOpSK7s3BeAIIJ9lL0XjplOghOCXp1WTfh2MOr0vS\",\"email\":\"j@lm.com\",\"id\":1}"
},
这是我participant
的关系:
"relations": {
"identities": {
"type": "hasMany",
"model": "userIdentity",
"foreignKey": "userId"
},
"credentials": {
"type": "hasMany",
"model": "userCredential",
"foreignKey": "userId"
},
"accessTokens": {
"type": "hasMany",
"model": "AccessToken",
"foreignKey": "userId"
}
},
请注意我必须使用"userId"
。 judge
也完全相同。我尝试使用"participantId"
,但每当我尝试登录时都会出现401
错误。
答案 0 :(得分:2)
我也可以访问/ participant / 1就好了(登录用户的ID)。
现在以同样的方式,我也能够访问/ judge / 1!这似乎有点风险。
您是否在这些端点上设置了访问控制?否则它们默认是打开的。
另外,我建议不要扩展User
两个不同的模型,因为在这里你似乎只需要在扩展用户的单个模型上设置roles。如果participant
和judges
最后,IMO,你应该知道loopback-component-passport存储库没有显示很多活动,目前15公关开放,用户报告各种错误而没有太多支持。这是一个选择问题,但我建议直接使用passportjs
。你真的会理解幕后发生了什么,并将它添加到一个环回应用程序实际上并不那么难。
编辑:
如果删除环回组件,我采用的策略是使用OAuth并利用环回的访问控制系统。
在环回组件设计中,有三种模型:
在论文中,减少OAuth系统和环回User
模型之间的耦合是很好的。
然而,在实践中,我发现这对于设置访问控制很困难。由于UserIdentity
扩展了PersistedModel
而非User
,这意味着UserIdentity
模型不能用于访问控制。例如,不可能让UserIdentity
成为其他东西的$ owner。
可以从给定的useridentity实例中找到用户并使用ACL。如果用户确实可以拥有许多UserIdentity,这可能会很有趣。在实践中,这似乎并不有用,因为如何从不同的UserIdentity可靠地识别用户? (基本上,同一个用户可以拥有Twitter帐户,谷歌帐户等,但可以使用哪些信息将它们可靠地链接在一起?几乎没有任何东西)
相反,我使用的方法是:
provider
& provider_id
存储oauth身份验证提供程序的名称,以及此提供程序平台上的用户ID 然后,当用户通过oauth对我的平台进行身份验证时,第一次创建MyUser
实例。由于MyUser
始终需要电子邮件和密码,因此我生成了两个:
provider_id
@ myapp。provider
。com 这样,用户就会将帐户归为一个唯一的电子邮件,但无法通过OAuth手动登录"
这是在每次验证请求成功时调用的来自护照的serializeUser回调(搜索"序列化"在http://passportjs.org/docs/authenticate中)中完成的
然后,每次用户通过oauth再次进行身份验证时,手动生成Loopback令牌并将其传回响应中,这样就可以识别最终用户,并且可以利用整个LB ACL系统。
希望这有帮助,如果您有反馈,请不要犹豫