通过电子邮件限制Firebase用户

Mat*_*ers 4 firebase firebase-security firebase-authentication

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

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

然后在安全规则中:

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

但是看来您不能indexOf在这些安全规则中使用。

也许我需要有一个可接受的电子邮件列表,然后在用户注册时检查它是否在该列表中并将其UID添加到接受列表中?我想我可以通过云功能执行此操作?

任何帮助将非常感激。

干杯

rzy*_*mek 6

在数据库中具有允许的用户电子邮件列表:

"whitelist": {
   "fred@gmail%2Ecom": true,
   "barney@aol%2Ecom": true
 }
Run Code Online (Sandbox Code Playgroud)

由于键中不允许使用句点,因此在存储字符串之前,需要先对它们进行转义。

然后在数据库中规则:

{
    "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()"
    }
}
Run Code Online (Sandbox Code Playgroud)

可通过访问用户的电子邮件auth.token.email。您需要转义点(.-> %2E)并检查该键是否存在于白名单中。

这些规则不允许任何人/whitelist对数据库部分进行读写访问。只能通过Firebase控制台进行修改。

  • 可以确认 3 年后这仍然是一个可行的解决方案 (2认同)

Mat*_*ers 5

谢谢大家,我最终做的是列出可接受的电子邮件:

{
    "validEmails": ["test@test.com"],
    "validUsers": {}
}
Run Code Online (Sandbox Code Playgroud)

然后运行一个云函数来检查用户注册时的电子邮件是否在有效电子邮件列表中。如果是,则将其添加到有效用户列表中,如果不是,则删除新创建的用户。我还设置了数据规则,以便只有 validUsers 内的用户才能访问数据。

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

  • @AníbalRivero Firebase 允许您编写[云函数](https://firebase.google.com/docs/functions/),它基本上只是在 node.js 服务器上运行的 javascript。它们挂钩特定的操作并允许您运行代码来响应某些内容。在上面的示例中,我使用“functions.auth.user().onCreate()”来检查刚刚注册的用户在有效电子邮件列表中是否有电子邮件。如果没有,它将删除它们。 (3认同)