作者:男孩艹艹 | 来源:互联网 | 2023-05-25 12:28
我的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存在(用户登录)然后让他写.但我显然不完全明白规则如何运作.我正在使用简单的电子邮件/密码验证.
如何测试这些规则以及如何将参数传递给它们?
1> Frank van Pu..:
我将尝试解释您的.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中的任何位置.
在安全规则中,您可以检查相同的结构.但是这里只提供了一小部分信息,足以识别用户.auth对象的Firebase文档为这些属性命名:
提供者 | 使用的验证方法("密码","匿名","Facebook","github","谷歌"或"推特").
uid |唯一的用户ID,保证在所有提供商中都是唯一的.
有了这些属性,我们就可以允许特定用户对我们的数据进行写访问.就像我在评论中所说的那样:
".write": "auth.uid = 'twitter:4511241'"
这将允许我在使用@puf twitter帐户登录时写入数据.但不幸的是,它不允许我检查更多用户友好的属性,例如电子邮件地址.
通常的做法是Users
在Firebase中创建顶级节点,并为该节点下的所有用户添加由其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还是其他一些受支持的提供商登录,只要他们为每个帐户使用相同的电子邮件地址,他们就能够写入数据.