获取符合存储规则的 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(而 androidios 有)。

如果您想为 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 存储映像安全规则

Firebase 存储规则错误:意外标识符;从文档中获取的功能

如何从 Cloud Function 获取 Firebase 项目名称或 ID

Firebase Cloud Storage 规则能否针对 Firestore 数据进行验证?