组的Firebase存储安全规则

时间:2019-11-28 16:03:44

标签: firebase google-cloud-firestore firebase-storage firebase-security

我知道与此有关的几个问题(例如https://stackoverflow.com/a/52808572/3481904),但我仍然没有很好的解决方案。

我的应用程序具有,它们是动态创建/删除的,并且成员(用户)可以随时添加/删除。

每个组具有0..N个私有文件(Firebase存储),保存在不同的路径中(均具有前缀groups/{groupId}/...)。

在Firestore安全规则中,我使用get()exists()来了解登录用户是否是组的一部分。但是我无法在Firebase存储安全规则中执行此操作。

提出的2个解决方案是:

  • 用户声明:

,但是令牌需要刷新(注销/签入或更新过期的令牌),这在我的用例中是不可接受的,因为用户一旦被邀请就需要立即访问。此外,用户可以是许多组的一部分,这些组可能会超过1000个字节。

  • 文件元数据:

但是组可以在不同路径中包含N个文件,因此我将需要循环列出组中的所有文件,并在每个文件的元数据中设置组成员的userIds,以允许对其进行访问。添加/删除成员时,这将是由Firestore(Firebase功能)触发的操作。

我不喜欢这种方法,因为:

  • 需要循环列出N个文件并为每个文件设置元数据(性能不佳)
  • 要添加新文件,我想我需要将create设置为public(因为尚无要检查的元数据),然后需要触发一个Function将userIds添加到元数据
  • 授予文件访问权限可能会延迟几秒钟,如果用户在此之前打开论坛页面,体验不好,可能会导致问题

所以,我的问题是:

  1. 有没有更好的方法?
  2. 如果我仅允许客户端在认证时getcreate所有文件(不允许deletelist),那么这足以保证安全性吗?我认为,恶意黑客可能会向匿名用户上传任何内容,或者如果他们知道路径,则可能读取所有私有组文件...

谢谢!

1 个答案:

答案 0 :(得分:1)

如果自定义声明对您不起作用,则实际上没有实现这一目标的“好”方法。您唯一的实际选择是:

  • 以某种方式使用Cloud Functions将Firestore中的相关数据镜像到Storage中,将Firestore文档数据放入Storage对象元数据中,以通过规则进行检查。
  • 通过您控制的后端(也可以是Cloud Functions)将对存储的所有访问路由到执行所有相关安全检查的后端。如果您使用Cloud Functions,则此方法不适用于内容大于10MB的文件,因为这是对Cloud Functions请求和响应大小的限制。

请提交具有Firebase支持的功能请求,以允许在存储规则中使用Firestore文档-这是常见的请求。 https://support.google.com/firebase/contact/support