访问firebase规则中的电子邮件地址

Joh*_*ohn 5 firebase firebase-security firebase-authentication firebase-realtime-database

我正在使用firebase 3.在编写firebase规则时,auth对象只包含uid和提供者.有没有什么办法可以增强这个也提供电子邮件地址?

我想要解决的问题是,我工作的网站的所有者要根据他们的电子邮件地址权限的用户,因为他不知道他们的火力点的uid前面.

我已经看到这个解决方案建议将用户对象持久保存在firebase中(使用电子邮件),然后将其用作规则中的参考点.我可以用看到的问题是,如果有人知道拥有完全权限的用户的电子邮件地址,它会很容易调试代码,并操纵之前的电子邮件地址保存到火力点,这意味着它会拯救他们的火力点id和别人的电子邮件地址一起.

我能看到使这个安全的唯一方法是让firebase规则中的auth对象提供的电子邮件地址不能被黑客攻击.

我错过了什么吗?


更多信息


我们的想法是,我们可以通过将位置名称添加到用户的电子邮件地址来控制对特定位置的数据的访问:

  1. 由站点管理员手动创建用户,提供对数据子集的访问.例如
-users
  -user1Email
    -locations
      -someLocation:true
      -someOtherLocation:true
Run Code Online (Sandbox Code Playgroud)
  1. 用户通过谷歌进行身份验证.在客户端,我们可以在auth.user.email中看到他们的电子邮件地址

  2. 在规则中,我想做类似的事情

locations : {
  "$location": {
      ".read": "root.hasChild('users/' + auth.email + '/locations/' + $location)",
   }
}
Run Code Online (Sandbox Code Playgroud)

我知道我需要逃避电子邮件地址,只是为了让它保持简单.

我已经在模拟器中对此进行了测试,如果我使用自定义提供商并在那里提供电子邮件,它可以正常工作,但使用谷歌规则中的"auth"只有uid和提供商属性,而不是电子邮件.

另一种方法(不是使用自定义的供应商除外),允许用户首先创建自己的帐户,然后将位置使用他们的uid的关键,而不是他们的电子邮件地址添加到每个用户,但老板希望能提前设置,以便他们第一次立即登录.

ado*_*srs 1

Firebase 团队仍在努力在 auth 对象中提供电子邮件,您可以auth.token.email在规则中使用一些限制来找到它。请查看这篇文章以获取更多详细信息。

如果当前的 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)"
    }
  }
Run Code Online (Sandbox Code Playgroud)

请记住,您需要增强它们以确保只有正确的用户才能编辑这个新user_emails分支。