通过电子邮件限制 Firebase 用户
Restrict Firebase users by email
我有一个客户希望能够列出可以访问数据的受限电子邮件。因此,任何其他使用该应用程序的人都无法 read/write 任何数据(理想情况下甚至无法登录,但我认为 Firebase 不可能做到这一点?)。关于如何解决这个问题的任何想法?我曾想过拥有一系列已接受的电子邮件并检查他们的电子邮件是否存在于安全规则中,但这似乎没有用。我在数据库中有以下内容:
"validEmails": ["test@test.com"]
然后在安全规则中:
".read": "root.child('validEmails').val().indexOf(auth.token.email) > -1"
但看起来您不能在这些安全规则中使用 indexOf
。
也许我需要一个可接受的电子邮件列表,然后当用户注册时,它会检查他们是否在该列表中并将他们的 UID 添加到可接受的列表中?我想我可以通过云功能或其他方式做到这一点?
如有任何帮助,我们将不胜感激。
干杯
一旦您启用了 Firebase 的身份验证模块,我相信您不能将其限制为电子邮件地址或域。但是,您可以通过其他方式保护您的数据库。如果您的用户已经注册并且您知道他们的 uid
,那么您可以根据这些限制读写权限。
假设您在数据库中有一个 acl
对象,您可以列出用户及其 uid
及其 read/write 权限。
这些规则将检查每个请求并只允许授权用户访问数据。
{
"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 }
}
}
在数据库中有允许的用户电子邮件列表:
"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 控制台进行修改。
谢谢大家,我最后做的是列出可接受的电子邮件:
{
"validEmails": ["test@test.com"],
"validUsers": {}
}
然后有一个云功能 运行 检查用户注册时他们的电子邮件是否在有效的电子邮件列表中。如果是,则将它们添加到有效用户列表中,如果不是,则删除新创建的用户。我还设置了数据规则,以便只有 validUsers 中的用户才能访问数据。
前端然后为无效用户处理重定向等。
我有一个客户希望能够列出可以访问数据的受限电子邮件。因此,任何其他使用该应用程序的人都无法 read/write 任何数据(理想情况下甚至无法登录,但我认为 Firebase 不可能做到这一点?)。关于如何解决这个问题的任何想法?我曾想过拥有一系列已接受的电子邮件并检查他们的电子邮件是否存在于安全规则中,但这似乎没有用。我在数据库中有以下内容:
"validEmails": ["test@test.com"]
然后在安全规则中:
".read": "root.child('validEmails').val().indexOf(auth.token.email) > -1"
但看起来您不能在这些安全规则中使用 indexOf
。
也许我需要一个可接受的电子邮件列表,然后当用户注册时,它会检查他们是否在该列表中并将他们的 UID 添加到可接受的列表中?我想我可以通过云功能或其他方式做到这一点?
如有任何帮助,我们将不胜感激。
干杯
一旦您启用了 Firebase 的身份验证模块,我相信您不能将其限制为电子邮件地址或域。但是,您可以通过其他方式保护您的数据库。如果您的用户已经注册并且您知道他们的 uid
,那么您可以根据这些限制读写权限。
假设您在数据库中有一个 acl
对象,您可以列出用户及其 uid
及其 read/write 权限。
这些规则将检查每个请求并只允许授权用户访问数据。
{
"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 }
}
}
在数据库中有允许的用户电子邮件列表:
"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 控制台进行修改。
谢谢大家,我最后做的是列出可接受的电子邮件:
{
"validEmails": ["test@test.com"],
"validUsers": {}
}
然后有一个云功能 运行 检查用户注册时他们的电子邮件是否在有效的电子邮件列表中。如果是,则将它们添加到有效用户列表中,如果不是,则删除新创建的用户。我还设置了数据规则,以便只有 validUsers 中的用户才能访问数据。
前端然后为无效用户处理重定向等。