Google Cloud Storage - 用于列出和下载存储桶中对象的签名 URL

问题描述

我正在尝试授予未经身份验证的访问权限(限时)以列出和下载 Google Storage 存储桶中的对象,并且发现签名 URL 可以解决问题。但是签名 URL 对单个对象很有用,他们在文档中提到了 https://cloud.google.com/storage/docs/access-control/signed-urls#considerations

使用签名网址时,请记住以下几点:

签名 URL 只能用于通过以下方式访问 Cloud Storage 资源 XML API 端点。

通常可以为任何 XML API 请求创建签名 URL;然而, Node.js 云存储客户端库目前只能使 单个对象的签名 URL。例如,它不能用于 制作签名 URL 以列出存储桶中的对象。

有没有办法,在 Node.js、Python、Java 或任何其他客户端库中,或者通过手动创建签名 url 来与用户共享链接,以便他们可以浏览存储桶并下载所需的对象?

谢谢!

解决方法

简短的回答不是。

但我可以解释原因。事实上,您必须了解签名网址为何如此出色和有用。

我举个例子。您有一个 1Tb 的文件并且请求者想要下载它。您有 2 个解决方案

  • 在服务器本地下载文件,然后让用户从服务器下载文件
  • 让用户直接从原始位置(云存储)下载文件。

在第一个解决方案中,用户已经在服务器上进行了身份验证,很容易让他们安全地下载文件。但是,在用户下载之前,您需要一个巨大的临时存储空间来临时存储文件

在第二个解决方案中,没有存储问题(因此也适用于无服务器解决方案、Cloud Run、Cloud Function 和 App Engine),但您需要委派下载文件的授权:这是签名 URL 的目的。


现在,回到您的用例:您想要委托文件列表功能。为什么?因为你有存储问题?性能问题?还是为了方便?

因为这个解决方案没有解决任何问题,所以没有实施。因此,您需要直接从您的服务器提供文件列表,然后使用签名 URL 委托下载,用户选择了他们想要的文件。


编辑 1

您需要拥有 Google 身份(用户帐户或服务帐户)才能获得 IAM 服务的授权才能访问您的存储桶信息。

但是,如果您拥有非 Google 托管身份令牌,则可以使用一项新功能。您可以使用 Workload Identity Pool

思路如下:

  • 配置提供程序以从您拥有的身份令牌中提取正确的数据
  • 配置身份令牌声明与要模拟的服务帐号之间的映射
  • 模拟服务帐户,从中生成访问令牌,然后使用此令牌访问授予服务帐户的所有 API。

我没有找到可以使用的功能,但它运行良好且符合您的要求!

,

您不能为此使用签名 URL。您可以授予用户帐户对存储桶的真正权限,但使用 conditional IAM policy 使其成为临时权限,例如 this example