我使用的是firebase 3。 编写firebase规则时,auth对象仅包含uid和提供程序。有没有什么办法可以增强它以提供电子邮件地址?
我试图解决的问题是,我正在处理的网站的所有者希望根据用户的电子邮件地址对用户进行许可,因为他不知道他们的火力库是什么前面。
我已经看到了这个解决方案,建议将用户对象持久保存在firebase中(使用电子邮件),然后将其用作规则中的参考点。 我可以看到的问题是,如果有人知道具有完全权限的用户的电子邮件地址,那么在保存到firebase之前调试代码并操纵电子邮件地址会相当容易,这意味着它会保存他们的firebase与其他人的电子邮件地址一起使用。
我能看到保证安全的唯一方法是在firebase规则中提供auth对象中提供的电子邮件地址,但不能被黑客攻击。
我错过了什么吗?
更多信息
我们的想法是,我们可以通过将位置名称添加到用户的电子邮件地址来控制对特定位置的数据的访问权限:
-users
-user1Email
-locations
-someLocation:true
-someOtherLocation:true
用户通过谷歌进行身份验证。在客户端,我们可以在auth.user.email
在规则中,我想做类似
locations : {
"$location": {
".read": "root.hasChild('users/' + auth.email + '/locations/' + $location)",
}
}
我知道我需要逃避电子邮件地址,只是为了让它保持简单。
我已经在模拟器中对此进行了测试,如果我使用自定义提供商并在那里提供电子邮件,它可以正常运行,但是使用google" auth"在规则中只有uid和提供者属性,而不是电子邮件。
替代方案(除了使用自定义提供商之外)是允许用户首先创建他们的帐户,然后使用他们的uid作为密钥而不是他们的电子邮件地址将位置添加到每个用户,但是所有者想要能够提前设置,以便他们第一次立即登录。
答案 0 :(得分:1)
Firebase小组仍在努力在auth对象中提供电子邮件,您可以使用规则中的auth.token.email
找到一些限制。请查看this post以获取更多详细信息。
如果当前的firebase解决方案无法满足您的所有需求,则可以选择一些解决方法。
由于您希望保留当前的/users
结构,无论何时注册新用户,都可以将用户uid链接到新分支/user_emails
中的相应电子邮件,该分支只会存储$uid: email
}。然后您的规则将如下所示。
"user_emails": {
"$uid": {
".write": "auth.uid == $uid",
".validate": "!root.child('Users').hasChild(newData.val())"
}
},
"locations": {
"$location": {
".read": "root.hasChild('users/' + root.child('user_emails').child(auth.uid).val() + '/locations/' + $location)"
}
}
请注意,您需要对其进行增强,以确保只有合适的用户才能编辑此新的user_emails
分支。