通过电子邮件限制 Firebase 用户

Posted

技术标签:

【中文标题】通过电子邮件限制 Firebase 用户【英文标题】:Restrict Firebase users by email 【发布时间】:2018-02-12 07:20:09 【问题描述】:

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

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

然后在安全规则中:

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

但您似乎不能在这些安全规则中使用indexOf

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

任何帮助将不胜感激。

干杯

【问题讨论】:

"但这似乎不起作用" 听起来你已经尝试了一些应该有效的方法。请编辑您的问题以包含minimal code that reproduces what you tried。另请参阅此答案以获得更通用的“按域锁定数据库”***.com/questions/36943350/… 抱歉,弗兰克,我已经更新了问题以反映我尝试过的无效代码。 【参考方案1】:

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

"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 控制台进行修改。

【讨论】:

可以确认 3 年后这仍然是一个可行的解决方案【参考方案2】:

谢谢大家,我最终得到了一份可接受的电子邮件列表:


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

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

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

【讨论】:

您能否详细说明您如何“运行云功能以检查用户何时注册他们的电子邮件是否在有效的电子邮件列表中”?谢谢! @AníbalRivero Firebase 允许您编写 cloud functions,它基本上只是在 node.js 服务器上运行的 javascript。它们与特定操作挂钩,并允许您运行代码以响应某些事情。在上面的示例中,我使用functions.auth.user().onCreate() 检查刚刚注册的用户是否在有效电子邮件列表中拥有电子邮件。如果不是,它会删除它们。【参考方案3】:

启用 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 
  

【讨论】:

谢谢,我想知道是不是这样。我将不得不重新考虑客户处理这种情况的方法并围绕它进行构建。

以上是关于通过电子邮件限制 Firebase 用户的主要内容,如果未能解决你的问题,请参考以下文章

通过firebase云功能发送电子邮件

Firebase 身份验证:通过特殊电子邮件地址(例如 *@gmx.at)发送但未收到的电子邮件

通过 Firebase 函数发送电子邮件时出现 Firebase SendGrid 错误 - 错误:错误请求

Firebase Auth 为同一电子邮件创建重复用户

将电子邮件从身份验证列表发送给Firebase上的所有用户

如何将 Firebase 数据库锁定给来自特定(电子邮件)域的任何用户?