通过电子邮件限制Firebase用户

时间:2017-09-04 05:01:24

标签: firebase firebase-authentication firebase-security

我有一个客户希望能够列出可以访问数据的受限制电子邮件列表。因此,任何访问应用程序的人都无法读取/写入任何数据(理想情况下甚至无法登录,但我认为Firebase可能无法实现这一点?)。关于如何解决这个问题的任何想法?我曾想过要收到一系列已接受的电子邮件,并检查他们的电子邮件是否存在于安全规则中,但似乎无法正常工作。我在数据库中有以下内容:

"validEmails": ["test@test.com"]

然后在安全规则中:

".read": "root.child('validEmails').val().indexOf(auth.token.email) > -1"

但看起来您无法在这些安全规则中使用indexOf

也许我需要一个可接受的电子邮件列表,然后当用户注册时,它会检查他们是否在该列表中并将其UID添加到接受列表中?我想我可以通过云功能或其他什么来做到这一点?

非常感谢任何帮助。

干杯

3 个答案:

答案 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中的用户才能访问数据。

然后前端处理无效用户的重定向等。