Firebase-admin node.js 外部存储桶上的 getDownloadURL 权限错误

问题描述 投票:0回答:1

需要:
getDownloadURL
在外部桶上

我们有一个 Firebase/GCP 项目,我们希望使用 Node.js 中的

getDownloadURL
Firebase 存储功能 为不同项目中存储桶中的对象创建永久签名 URL。

具体来说,我们有一个资产存储桶,我们希望为其中的对象生成长期(永远)的 URL,但不公开该存储桶。资产存储桶为许多项目提供服务,我们希望所有这些项目都能够针对资产存储桶生成 URL(无需执行任何特殊操作)。

复制

在 Firebase 函数中(或任何具有作为默认服务帐户运行的应用程序默认凭据的东西):

import { Storage, type Bucket, type File } from '@google-cloud/storage'
import { getDownloadURL } from 'firebase-admin/storage'

async function getURL (): Promise<string> {
  const b: Bucket = new Storage().bucket("external-asset-bucket")
  const f: File = b.file("/any-file")
  const url = await getDownloadURL(o) // permission error
  return url
}

错误:权限被拒绝

当我们运行

getDownloadURL
时,我们收到以下错误:

“错误:权限被拒绝。请通过访问 Firebase 控制台中的存储选项卡为您的存储桶启用 Firebase 存储,并确保您有足够的权限来正确配置资源。”

该错误建议我们将存储桶添加到 Firebase 项目中。当我们尝试通过 Firebase 控制台添加存储桶时,我们可以创建或导入存储桶,但不清楚“导入”的含义(复制?跨项目移动存储桶?等),也不清楚它是否可以跨项目工作。我们找不到任何文档来说明它的作用或是否有帮助,但它似乎也与权限问题(期望通过 IAM 权限解决)没有必要/无关。

尝试修复

我们还发现了一些我们尝试过的建议:

  1. 授予存储管理员对存储桶上的 [电子邮件受保护]
  2. 在 Firebase 项目上将存储规则设置为允许所有
  3. 将存储桶上的存储管理员权限授予运行 Firebase 功能的服务帐户

该错误没有给出如何解决此问题的有用指示,没有关于需要哪些权限的明显文档,并且来自 Google/etc 的大多数信息都已过时或错误。

解决方法

作为一种解决方法,我们还考虑使用长期 V2 签名 URL ,但文档明确指出要使其保持短暂,并且 V4 签名 URL 有任意 7 天的限制,但会出现

getDownloadURL
功能是在这里做的正确/理想的事情(如果有效的话)。

我们如何在 GCP 项目之外的存储桶中的对象上使用

getDownloadURL

相关:

firebase google-cloud-platform google-cloud-storage firebase-storage firebase-admin
1个回答
0
投票

当我们尝试通过 Firebase 控制台添加存储桶时,我们可以创建或导入存储桶,但不清楚“导入”的含义(复制?跨项目移动存储桶?等),也不清楚它是否可以跨项目工作。我们找不到任何文档来说明它的作用或是否有帮助

虽然没有正式的产品文档,但您正在寻找的参考资料是:

在控制台中,您可以将存储桶链接到 Firebase,如下所示:

  1. 转到存储产品
  2. 使用现有默认存储桶上的三点菜单
  3. 选择“添加存储桶”选项
  4. 选择“导入现有的 Google Cloud Storage 存储桶”
© www.soinside.com 2019 - 2024. All rights reserved.