我将尝试解释您的.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 的情况下,用户的 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”、“google”或“twitter”)。
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"
我把 provider 和 id 留在这里,因为它们没有为示例提供太多价值
当您知道用户的uid时,您可以在此节点中查找他的附加信息。这正是您之前的安全规则所做的:
"root.child('Users').child(auth.uid).child('email').val() === 'testuser@test.com'"
因此,这将从您的 Firebase 的根目录查找名为 Users 的节点,然后查找登录用户的 uid 以及他/她的电子邮件地址。
检查特定电子邮件地址的好处在于它与用户的提供商无关。因此,无论用户是使用 twitter、github、facebook 还是其他支持的提供商登录,只要他们为每个帐户使用相同的电子邮件地址,他们就可以写入数据。