我正在教自己AngularJS和Firebase,并正在开发一个具有两个用户角色A和B的应用。角色B只有在拥有有效邀请码的情况下才能注册到该网站。
我使用Firebase作为后端和AngularFire绑定。我用Yeoman发电机发电机 - angularfire建立了我的项目。后者提供Firebase基本密码/简单登录验证方法。
我的注册表单包含的字段多于电子邮件/密码。用户ID,电子邮件,通行证由Firebase在内部处理并成功存储。此外,我在另一个名为" accounts"
的Firebase文档中成功注册后保存了其他字段。"accounts": {
"simplelogin:16" : {
"company" : "foo corp",
"firstName" : "lorem",
"lastName" : "ipsum",
"type" : "userRoleA"
},
"simplelogin:19" : {
"company" : "bar corp",
"firstName" : "dolor",
"lastName" : "sit",
"type" : "userRoleA"
},
"simplelogin:17" : {
"city" : "new york",
"firstName" : "asd",
"lastName" : "asd",
"type" : "userRoleB"
},
"simplelogin:18" : {
"city" : "washington",
"firstName" : "a",
"lastName" : "a",
"type" : "userRoleB"
}
}
现在我正在尝试找到一种实现邀请代码功能的安全方法。我添加了名为" inviteCodes":
的Firebase文档"inviteCodes" : {
"111" : {
"generator" : "system"
},
"222" : {
"generator" : "system"
},
"333" : {
"generator" : "system"
}
}
1 - 生成邀请码:我不能简单地将它们直接放在Firebase中,因为在后面的步骤中我希望用户A能够生成这些代码。 但是如何在不将方法暴露给前端的情况下在Firebase上生成代码?我会通过添加Firebase规则来解决这个问题,只授予类型为" userRoleA"在"帐户内#34;文档写入访问" inviteCodes"文献。这是要走的路还是另外一种方式?因为在这种情况下,生成代码的方法仍然存在。
2 - 假设1)已解决且邀请代码位于Firebase文档中。注册后,在调用$ createUser方法之前,我需要检查提供的邀请代码是否有效。我会查询Firebase并检查提供的代码是否与任何已保存的邀请代码匹配。像这样的东西(用于说明的虚拟代码):
var firebaseCodes = firebaseRefInviteCodes;
var providedCode = registrationForm.providedCode;
var isCodeValid = false;
for (var i = 0; i < firebaseCodes.length; i++) {
if (firebaseCodes[i] === providedCode) {
isCodeValid = true;
}
}
但同样,在此查询中,所有代码都将暴露给前端。 是否可以检查所提供的代码是否有效而不暴露所有代码?
感谢您的意见。
答案 0 :(得分:4)
为了生成邀请,我没有看到前端这样做的任何问题 - 直到它是一个安全的随机令牌生成器。您也可以让Firebase生成它:
var inviteCode = firebaseRef.push().key();
安全规则是在Firebase中保护应用程序数据的有效方法。但是,为了使它们正常工作,您必须以正确的方式设计数据结构。在这种情况下,'关系'数据库方法不起作用。 问题是userA只与userB共享邀请,其他任何人都必须能够“看到”它们。因此,将所有访问代码存储在一个“表”中并不是一个好选择。 我假设当userA创建邀请时,它知道该邀请所针对的用户。在这种情况下,您可以设计类似于此的数据结构:
-inviteCodes
-invitee
-{$userB_email}
-code: {codeValue}
-inviterId: {userAId}
-generator: "system"
使用此结构,安全规则可以如下:
/inviteCodes/invitee - public, so userA can insert new invite code for userB
/inviteCodes/invitee/{userB_email} - write new data - public, read - private, can be accessed only by userB, e.g. data.exists() && newData.child('email').val() === $userB_email && newData.child('inviteCode').val() === data.child('code').val()
生成代码的用户也可以存储生成代码的用户的电子邮件,然后它也可以使用电子邮件及其inviterId访问此数据。
通过这种方式,您无需为其他用户检索邀请。