如何在Firebase中验证转义的基于电子邮件的用户帐户?

如何在Firebase中验证转义的基于电子邮件的用户帐户?,firebase,firebase-security,Firebase,Firebase Security,我正在使用Firebase简单登录的电子邮件/密码验证选项。我将转义电子邮件中的用户数据存储为密钥,“.”字符已替换为“,”(因为Firebase不允许将“.”存储在密钥中),而不是使用用户ID作为密钥。问题是,在安全规则中,我无法使用regex根据auth.email变量对转义的电子邮件进行身份验证。因此,我无法执行以下操作: users: { $user: { ".read": "auth.email == $user", ".write": "auth.email =

我正在使用Firebase简单登录的电子邮件/密码验证选项。
我将转义电子邮件中的用户数据存储为密钥,“.”字符已替换为“,”(因为Firebase不允许将“.”存储在密钥中),而不是使用用户ID作为密钥。问题是,在安全规则中,我无法使用regex根据auth.email变量对转义的电子邮件进行身份验证。因此,我无法执行以下操作:

users: {
  $user: {
    ".read":  "auth.email == $user",
    ".write": "auth.email == $user"
  }
}
因为每个$user看起来都像“some”,one@domain而auth.email则是一些。one@domain.co.uk“。

有办法解决这个问题吗?我是否需要将用户id存储在每个$user中以实现用户智能身份验证?在这种情况下,我想简单地将用户数据存储在基于id的节点中比存储转义的电子邮件更容易。

更新:

如果您使用的是Firebase简单登录电子邮件/密码身份验证,建议您根据
uid
字段输入关键用户,该字段不会更改,并且在Firebase的所有用户中都是唯一的,无论他们是通过电子邮件/密码、Facebook、Google等进行身份验证

早期版本的Firebase身份验证(即Firebase简单登录)将电子邮件地址放入安全规则
auth
变量中,但这已被删除,因为(1)并非所有用户都有电子邮件地址,(2)用户可能有多个电子邮件地址,(3)电子邮件地址可以更改。因此,它们对于Firebase中的索引并不理想


原始答案:

但是,如果您希望根据电子邮件地址为数据设置密钥,则可以使用安全规则中的
.replace()
方法直接在安全规则中用逗号替换句点。例如:

".read": "root.child('users').child(auth.email.replace('.', ',')).exists()"

有关更多详细信息,请参阅。

真不敢相信我错过了这一次。或者事实上我没有错过它(因为我可以发誓我读过它)。相反,我忘记了安全规则中.replace()方法的行为与javascript的String.replace()方法不同,后者在不使用正则表达式的情况下只替换第一个找到的匹配子字符串。这就是正则表达式混乱的原因。感谢您提供文档的链接。:)