5

我使用的是Firebase 3. 编写Firebase规则时,auth对象只包含uid和提供者。有没有什么方法可以增强这个功能来提供电子邮件地址?访问Firebase规则中的电子邮件地址

我试图解决的问题是,我正在处理的网站的所有者想根据他们的电子邮件地址来授予用户权限,因为他不会预先知道他们的firebase。

我已经看到了解决方案,建议将用户对象保存在firebase(使用电子邮件),然后将其用作规则中的参考点。 我可以看到的问题是,如果有人知道具有完全权限的用户的电子邮件地址,那么在保存到Firebase之前调试代码并操作电子邮件地址会相当容易,这意味着它将保存它们Firebase ID与其他人的电子邮件地址一起。

为了安全起见,我唯一能看到的方法是在firebase规则中的auth对象中提供电子邮件地址,这些地址不能被黑客入侵。

我错过了什么吗?


更多信息


的想法是,我们可以通过添加位置名用户的电子邮件地址,控制访问某个具体位置的数据:

  1. 用户是由网站管理员手动提前创建,提供对数据子集的访问。 e.g
-users 
    -user1Email 
    -locations 
     -someLocation:true 
     -someOtherLocation:true 
  • 用户通过谷歌认证。在客户端,我们可以看到在auth.user.email

  • 他们的电子邮件地址,在规则,我要像做

  • locations : { 
        "$location": { 
         ".read": "root.hasChild('users/' + auth.email + '/locations/' + $location)", 
        } 
    } 
    

    我知道我需要逃避的电子邮件地址,只是为了保持现在简单。

    我已经在模拟器中测试过了,如果我使用自定义提供程序并在其中提供电子邮件,但它在规则中仅使用uid和提供程序属性,而不使用电子邮件,但它完美地工作。

    替代方案(除使用自定义提供者之外)是允许用户先创建自己的帐户,然后将位置添加到每个用户使用他们的uid作为关键字而不是他们的电子邮件地址,但所有者想要以便能够提前设置它,以便他们第一次马上登录它的话。

    +0

    你能描述一下你正在处理的确切用例吗?你是什​​么意思,“他不会预先知道他们的火炉基地”?用户在尝试做任何你期望的事情时会被认证吗? – adolfosrs

    +0

    抱歉花了我一秒来很好地格式化代码,但现在应该可读。 – John

    +0

    电子邮件地址现在在安全规则中的'auth'变量中经常可用。查看http://stackoverflow.com/questions/37986097/how-can-we-guarantee-that-the-email-saved-by-the-firebase-user-is-indeed-his-own –

    回答

    1

    火力地堡队仍在努力提供给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分支。

    +0

    当你说链接用户uid到相应的电子邮件,你的意思是手动做。或在用户登录后以编程方式? 如果以编程方式,我认为这不会解决安全问题,因为该代码可能会被恶意调用,从而提供已知具有完全访问权限的用户的电子邮件地址。然后,新的Firebase ID将链接到具有完全访问权限的用户。 如果手动,那么它仍然意味着我们必须让用户无需登录才能登录,然后手动添加它们,这正是我试图避免的。 – John

    +0

    @John使用firebase规则,您将确保用户能够编辑的唯一分支是其uid作为关键字的分支。刚刚添加了一个可以添加到'/ user_emails'分支的示例规则。 – adolfosrs

    +0

    @John是的。我的意思是编程式。无论何时你向'/ users'注册一个新用户,调用'createUser'或者任何你应该确保在回调中调用类似'ref.child(uid).set(email)'的东西。 – adolfosrs