我正在使用Firebase简单登录的电子邮件/密码验证选项。
我将用户的数据存储为已转发的电子邮件作为密钥,其中“。”字符已被','替换(因为Firebase不允许在键中存储'。)而不是使用用户ID作为键。问题是在安全规则中我不能使用正则表达式来验证针对auth.email变量的转义电子邮件。所以我不能做到以下几点:
users: {
$user: {
".read": "auth.email == $user",
".write": "auth.email == $user"
}
}
因为每个$用户看起来像'some,one @ domain,co,uk',而auth.email是'some.one@domain.co.uk'。
有没有解决这个问题的方法?我是否需要在每个$ user中存储用户ID以进行用户身份验证?在这种情况下,我想简单地将用户数据存储在基于身份的节点而不是转发的电子邮件中会更容易。
答案 0 :(得分:2)
<强>更新强>
如果您使用的是Firebase简单登录电子邮件/密码身份验证,建议您根据uid
字段为关键用户设置,该字段不会更改,并且对于Firebase的所有用户都是唯一的,无论他们是通过电子邮件/密码,Facebook,谷歌等进行身份验证
Firebase身份验证的早期版本(即 Firebase简单登录)会在安全规则auth
变量中放置一个电子邮件地址,但由于(1)并非所有用户都有电子邮件地址,(2)用户可能有多个电子邮件地址,(3)电子邮件地址可能会发生变化。因此,它们不适合Firebase中的索引。
原始答案:
但是,如果您希望根据电子邮件地址键入数据,则可以使用安全规则中的.replace()
方法直接在安全规则中用逗号替换句点。例如:
".read": "root.child('users').child(auth.email.replace('.', ',')).exists()"
有关详细信息,请参阅https://www.firebase.com/docs/security/string/replace.html。