我在Firebase读/写规则上受到了阻碍。我希望我有办法设置断点,因为它检查身份验证(没有办法,是吗?)。
我的问题很简单,我觉得我应该能够更好地理解它。我觉得大部分源于完全不了解规则。此信息用于在线查看产品的简单方法,并且所有者需要能够添加产品。所以我希望世界能够阅读,登录的人能够写作。
我的数据如下:
app
Users
email: xxx@xxx.com
product
0
name: pizza
我的规则:
{
"rules": {
"product":{
".read": true,
".write":"root.child('Users').child(auth.uid).child('email').val() === 'testuser@test.com'"
}
}
}
我并不清楚这意味着什么。我真的只想说,如果用户登录,则允许写入功能。我希望我可以这样".write": "auth"
这意味着如果auth存在(用户登录),那就让他写。但我显然不完全明白规则的运作方式。我使用简单的电子邮件/密码验证。
如何测试这些规则以及如何将参数传递给它们?
答案 0 :(得分:14)
我会尝试解释您的.write
安全规则,即:
"root.child('Users').child(auth.uid).child('email').val() === 'testuser@test.com'"
这确实不是最简单的规则,而Firebase文档确实很快就深入了解。
使用twitter登录我的应用程序后,我的代码将获得一个authData
变量,告诉它:
authData
uid: "twitter:4511241"
provider: "twitter"
id: "4511241"
可能还有一些属性,但这应该是它的要点。 authData通常包含一个子对象,该对象具有特定于提供者的属性,因此在这种情况下twitter
,您通常可以在那里找到一些非常有趣的东西。例如在Twitter的情况下,用户的推特名称。
authData
uid: "twitter:4511241"
provider: "twitter"
id: "4511241"
twitter:
userName: "puf"
email: "puf@twitter.com" // note: this is just an example email address,
// it doesn't exist (as far as I know)
此对象可供我的代码使用,默认情况下不会存储在Firebase中的任何位置。
在您的安全规则中,您可以检查相同的结构。但是这里只提供了一小部分信息,足以识别用户。 Firebase documentation for the auth object命名这些属性:
提供商 |使用的身份验证方法(“密码”,“匿名”,“Facebook”,“github”,“谷歌”或“推特”)。
uid |唯一的用户ID,保证在所有提供商中都是唯一的。
通过这些属性,我们已经可以允许特定用户对我们的数据进行写访问。就像我在你的评论中所说:
".write": "auth.uid = 'twitter:4511241'"
当我使用@puf twitter帐户登录时,这将允许我写入数据。但不幸的是,它不允许我检查更多用户友好的属性,例如电子邮件地址。
通常的做法是在Firebase中创建顶级Users
节点,并为该节点下的所有用户添加由其uid标识的所有信息。所以在上面我的案例中:
Users
twitter:4511241
userName: "puf"
displayName: "Frank van Puffelen"
email: "puf@twitter.com"
github:913631
userName: "puf"
displayName: "Frank van Puffelen"
email: "puf@github.com"
我离开了提供商和id,因为它们没有为示例提供太多价值
当您知道用户的uid
时,您可以在此节点中查找其他信息。这正是您以前的安全规则所做的:
"root.child('Users').child(auth.uid).child('email').val() === 'testuser@test.com'"
因此,这将从您的Firebase的根目录开始,查看名为Users的节点,然后是登录用户的uid
以及他/她的电子邮件地址。
检查特定电子邮件地址的一个很酷的事情是,它与用户的提供商无关。因此,无论用户是使用twitter,github,facebook还是其他支持的提供商登录,只要他们为每个帐户使用相同的电子邮件地址,他们就能够写入数据。
答案 1 :(得分:0)
执行以下操作似乎可以解决问题。如果auth变量存在,则允许写入能力。由于我没有完全理解这些规则,我不得不怀疑这是针对当前用户运行还是检查是否有用户登录。
{
"rules": {
"product":{
".read": true,
".write":"auth !== null"
}
}
}