我有一个客户希望能够列出可以访问数据的受限制电子邮件列表。因此,任何访问应用程序的人都无法读取/写入任何数据(理想情况下甚至无法登录,但我认为Firebase可能无法实现这一点?)。关于如何解决这个问题的任何想法?我曾想过要收到一系列已接受的电子邮件,并检查他们的电子邮件是否存在于安全规则中,但似乎无法正常工作。我在数据库中有以下内容:
"validEmails": ["test@test.com"]
然后在安全规则中:
".read": "root.child('validEmails').val().indexOf(auth.token.email) > -1"
但看起来您无法在这些安全规则中使用indexOf
。
也许我需要一个可接受的电子邮件列表,然后当用户注册时,它会检查他们是否在该列表中并将其UID添加到接受列表中?我想我可以通过云功能或其他什么来做到这一点?
非常感谢任何帮助。
干杯
答案 0 :(得分:3)
在数据库中列出允许用户的电子邮件列表:
"whitelist": {
"fred@gmail%2Ecom": true,
"barney@aol%2Ecom": true
}
由于密钥中不允许使用句点,因此您需要在存储字符串之前使用句点对其进行转义。
然后在数据库规则中:
{
"rules": {
"whitelist": {
".read": false,
".write": false
},
".read": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()",
".write": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()"
}
}
用户的电子邮件可通过auth.token.email
访问。你需要逃避点(.
- > %2E
)并检查白名单上是否存在密钥。
这些规则不允许任何人对数据库的/whitelist
部分进行读写访问。只能通过firebase控制台进行修改。
答案 1 :(得分:2)
启用Firebase的身份验证模块后,我认为您无法将其限制为电子邮件地址或域。但是,您可以通过其他方式保护数据库。如果您的用户已经注册并且您知道他们的uid
,那么您可以根据这些限制读写访问权限。
让我们假装您在数据库中有一个acl
对象,您可以列出用户及其uid
的读/写权限。
这些规则将检查每个请求,并仅允许授权用户访问数据。
{
"acl": {
[
{
"uid: "abc123"
"canRead": true,
"canWrite": true
},
{
"uid": "def456",
"canRead": true,
"canWrite": false
}
},
"secure": {
".read": { root.child('acl').child(auth.uid).child('canRead').val() == true }
".write": { root.child('acl').child(auth.uid).child('canWrite').val() == true }
}
}
答案 2 :(得分:1)
谢谢大家,我最终做的是收到一封可接受的电子邮件列表:
{
"validEmails": ["test@test.com"],
"validUsers": {}
}
然后运行云功能以检查用户何时注册,如果他们的电子邮件位于有效的电子邮件列表中。如果是,那么它将它们添加到有效用户列表中,如果没有,则删除新创建的用户。我还设置了数据规则,以便只有validUsers中的用户才能访问数据。
然后前端处理无效用户的重定向等。