firebase - 获取符合存储规则的 Firebase Cloud Storage 的客户端 URL
问题描述
我在 Firebase 上有一个 Web 应用程序,我在其中创建了一个引用 Firebase 存储文件的 Firestore 文档。
我已将 Firebase 存储上的规则设置为仅allow read: if request.auth != null
.
由于 Firestore 遵守类似的规则,我能够确保只有在用户通过身份验证时才能访问我的 Firestore 文档,但是如何最好地在我的 Web 应用程序中将相同的规则强制执行到 Firebase 存储文件?
getDownloadUrl()
当我上传文件并将 URL 存储在我的 Firestore 文档中时,我可以使用它。- 但 URL 始终对任何人公开- 我可以创建一个 Firebase 函数,在每个请求上检查身份验证,如果经过身份验证,生成一个
getSignedUrl()
过期时间为 5 分钟的函数,然后执行 302 重定向到临时公共 URL - 但这不符合 Firebase 存储规则,所以我需要复制函数中的任何新规则集
为什么 Firebase 存储不能像 Firestore 那样简单地运行并检查 http 请求的身份验证并返回文件是否符合规则?
我是否完全错过了 3) 和更好的选项来确保用户在访问存储中的文件之前已登录?
解决方案
当我上传文件并将 URL 存储在我的 Firestore 文档中时,我可以使用 getDownloadUrl()。- 但 URL 始终对任何人公开
从文档中可能不是很清楚,但这正是下载 URL 的设计方式。
为什么 Firebase 存储不能像 Firestore 那样简单地运行并检查 http 请求的身份验证并返回文件是否符合规则?
当您使用提供的客户端 SDK 下载文件(不使用下载 URL)时,它的行为类似。不幸的是,Web SDK 没有文件下载 API(而Android和iOS有)。
如果您想提交 Web SDK 的功能请求,应该去Firebase 支持。目前,您必须使用可公开访问的下载 URL。或者,您可以创建自己的后端端点,使用 Firebase Admin SDK验证客户端提供的身份验证令牌。后端代码可以决定用户是否应该能够获取文件内容。
推荐阅读
- reactjs - 如何配置 webpack 以使用 typescript 显示反应组件
- ruby - 如何修复“sudo bundle install”
- angular - 如何在模态单击时在 mat-table 中默认检查 angular8 中特定行的复选框?
- node.js - 我没有得到 jwt 令牌
- numpy - 计算两个numpy数组的向量之间的距离
- azure-keyvault - Spinnaker - Azure 密钥库集成
- wordpress - 创建自定义 WP 查询以获取自定义帖子类型
- javascript - 我想用 AJAX 从另一个域调用服务并得到 CORS 错误
- chatbot - 聊天机器人中的多个意图处理
- firebase - 如何使用问答应用 Flutter Firebase 设置我的数据库