获取符合存储规则的 Firebase Cloud Storage 的客户端 URL
Posted
技术标签:
【中文标题】获取符合存储规则的 Firebase Cloud Storage 的客户端 URL【英文标题】:Getting a client URL to Firebase Cloud Storage that comply with storage rules 【发布时间】:2021-02-28 19:16:30 【问题描述】:我在 Firebase 上有一个 Web 应用程序,我在其中创建了一个引用 Firebase 存储文件的 Firestore 文档。
我已将 Firebase 存储的规则设置为仅allow read: if request.auth != null
。
由于 Firestore 遵守类似的规则,我能够确保只有在用户通过身份验证时才能访问我的 Firestore 文档,但如何才能最好地在我的 Web 应用程序中对 Firebase 存储文件执行相同的规则?
-
当我上传文件并将 URL 存储在我的 Firestore 文档中时,我可以使用
getDownloadUrl()
。 - 但网址始终对任何人公开
我可以创建一个 Firebase 函数,在每个请求上检查身份验证,如果通过身份验证,生成一个有效期为 5 分钟的 getSignedUrl()
,然后执行 302 重定向到临时公共 URL - 但这不符合 Firebase存储规则,因此我需要在函数中复制任何新规则集
为什么 Firebase 存储不能像 Firestore 那样简单地运行并检查 http 请求的身份验证并返回文件是否符合规则?
我是否完全错过了 3) 和更好的选项来确保用户在访问存储中的文件之前已登录?
【问题讨论】:
【参考方案1】:当我上传文件并将 URL 存储在我的 Firestore 文档中时,我可以使用 getDownloadUrl()。 - 但网址始终对任何人公开
从文档中可能不是很清楚,但这正是下载 URL 的设计方式。
为什么 Firebase 存储不能像 Firestore 那样简单地运行并检查 http 请求的身份验证并返回文件是否符合规则?
当您使用提供的客户端 SDK 下载文件(不使用下载 URL)时,它的行为类似。不幸的是,Web SDK 没有文件下载 API(而 android 和 ios 有)。
如果您想为 Web SDK 提交功能请求,请发送至 Firebase support。现在,您必须使用可公开访问的下载 URL。或者,您可以使用 Firebase Admin SDK 创建自己的后端端点,verifies an auth token 由客户端提供。后端代码可以决定用户是否应该能够获取文件内容。
【讨论】:
谢谢道格。因此,作为一名网络应用程序开发人员,我需要选择问题中描述的选项 2)吗?是 302 重定向到 getSignedUrl() 最佳实践,还是您知道任何可能利用存储规则的最佳实践示例? 您可以使用任何适合您的用例的东西 - 我对此没有意见。以上是关于获取符合存储规则的 Firebase Cloud Storage 的客户端 URL的主要内容,如果未能解决你的问题,请参考以下文章
Firebase Cloud Firestore 数据库规则数据访问被拒绝
如何在 Cloud Functions 存储触发器中获取经过身份验证的 Firebase 用户的 uid
Firebase 存储规则错误:意外标识符;从文档中获取的功能