对于我们的应用程序,我们需要能够为组提供文件访问权限。每个用户可以有大量的组,因此使用“自定义令牌”解决方案没有意义(反正很尴尬。
我发现,Firebase的存储安全规则非常有限。主要问题是我们将组定义保存在Firestore中,而存储安全规则无法访问这些组定义。
为解决这个问题,我们决定在每个上载文件的元数据中包含一个“令牌”,该组中的任何人都可以访问该令牌。他们下载文件时,需要在请求参数中提供此令牌(例如/groups/xxx/filename.jpg?token=abc)。
所以我继续写了这些规则:
match /groups/{groupId}/{filename} {
allow read: if request.auth != null && request.params.token == resource.metadata.token;
allow write: if request.auth.uid == userId
&& request.resource.size < 1 * 1024 * 1024
&& request.resource.contentType.matches('image/.*')
&& (resource == null || request.resource.contentType == resource.contentType)
&& imageId.size() < 32
;
}
但是当我在模拟器中运行它时,出现错误:“错误:simulator.rules第[23]行,第[43]列。对象未定义属性参数。”指向带有“ request.params.token”的规则
文档特别指出,我们可以从请求对象https://firebase.google.com/docs/storage/security/secure-files?authuser=0#request_evaluation
中访问params对象。答案 0 :(得分:0)
听起来您正在尝试将Cloud Firestore中的某些数据代理到Cloud Storage请求中以用于安全规则。目前这是不可行的。 (最重要的是,request.params
指的是尚未记录的API,因此实际上无法使用。我已经在团队中提出来了,我们认为request.params
应该是从安全规则文档中删除。)
如果您想为Firebase Auth用户分配一些可以在产品(Firestore,Storage和Realtime Database)上验证的组身份,则可以使用custom claims。您需要在后端进行一些工作,才能直接将要检查的值分配给用户帐户。如果操作正确,则在request.auth.token
和Firestore安全规则中,在JSON blob中设置的值都会显示在{{1}}中。
答案 1 :(得分:0)
由于Firebase能够查询存储中的Firestore数据的严重限制以及关于request.param的不正确文档,我们不得不使用另一种方法。
我们决定在查询组文件时使用以下URL:
/ groups / {groupId} / {token} / {filename}
唯一的安全性要求是用户登录。由于上述令牌是秘密的,并且仅可供组成员使用,因此我们发现它非常安全。我们不允许列出目录,因此不可能简单地列出/ groups / {groupId}来查找任何令牌。
注意:另一个优化可能是在路径中不包含{groupId},但是我们认为最好包含调试和管理目的。
如果有人认为这是一种不安全的方法,请在评论中告知我们!
谢谢!