【发布时间】:2016-11-07 05:01:28
【问题描述】:
我正在使用 Firebase 3。 编写 firebase 规则时,auth 对象仅包含 uid 和提供程序。有什么方法可以增强它以提供电子邮件地址?
我要解决的问题是,我正在处理的网站的所有者希望根据用户的电子邮件地址授予用户权限,因为他不会预先知道他们的 firebase uid。
我已经看到了解决方案,建议将用户对象保存在 firebase 中(使用电子邮件),然后将其用作规则中的参考点。 我可以看到的问题是,如果有人知道具有完全权限的用户的电子邮件地址,那么在保存到 firebase 之前调试代码和操作电子邮件地址将相当容易,这意味着它将保存他们的 firebase id 旁边的其他人的电子邮件地址。
我认为确保安全的唯一方法是在 firebase 规则中的 auth 对象中提供电子邮件地址,这是无法被黑客入侵的。
我错过了什么吗?
更多信息
我们的想法是,我们可以通过将位置名称添加到用户的电子邮件地址来控制对特定位置的数据的访问:
- 站点管理员提前手动创建用户,提供对数据子集的访问。 例如
-users
-user1Email
-locations
-someLocation:true
-someOtherLocation:true
用户通过 google 进行身份验证。在客户端,我们可以在 auth.user.email 中看到他们的电子邮件地址
在规则中,我想做类似的事情
locations : {
"$location": {
".read": "root.hasChild('users/' + auth.email + '/locations/' + $location)",
}
}
我知道我需要转义电子邮件地址,只是暂时保持简单。
我已经在模拟器中对此进行了测试,如果我使用自定义提供程序并在其中提供电子邮件,它可以完美运行,但是使用 google 规则中的“auth”只有 uid 和提供程序属性,而不是电子邮件。
替代方法(使用自定义提供程序除外)是允许用户首先创建他们的帐户,然后使用他们的 uid 作为密钥而不是他们的电子邮件地址将位置添加到每个用户,但所有者想要能够提前进行设置,以便他们第一次登录时立即使用它。
【问题讨论】:
-
您能描述一下您要处理的具体用例吗? “他不会预先知道他们的火力基地 uid”是什么意思?当用户尝试执行您期望的任何操作时,他们是否会通过身份验证?
-
抱歉花了我一秒钟的时间来很好地格式化代码,但现在应该可以阅读了。
-
电子邮件地址现在经常可以在您的安全规则中的
auth变量中找到。见stackoverflow.com/questions/37986097/… -
@FrankvanPuffelen 太好了,正是我需要的。不过有一个问题..我试图去掉“。”和电子邮件地址中的“@”,因为这是现有数据保存在 firebase 中的方式,例如 auth.token.email.replace('.','') 等......但这似乎不起作用。 token.email 值的类型是什么?有什么方法可以将它转换为字符串而不是使用“匹配”?谢谢
-
据我所知它是一个字符串,这就是为什么我可以在它上面调用
matches()。
标签: firebase firebase-realtime-database firebase-authentication firebase-security