签名网址

本页面简要介绍签名网址,该网址提供了对特定 Cloud Storage 资源的限时访问权限。拥有签名网址的任何人都可以在其有效时限内使用该网址,无论是否有 Google 账号。如需了解如何创建签名网址,请参阅使用 Cloud Storage 工具执行 V4 签名流程使用自己的程序执行 V4 签名流程。如需了解如何以其他方式控制存储桶和对象的访问权限,请参阅访问权限控制概览

概览

签名网址提供有限的权限和时间用于发出请求。签名网址的查询字符串中包含身份验证信息,这样,用户无需凭据也可对资源执行特定操作。

  • 生成签名网址时,您必须指定一个具有足够权限的账号,以支持签名网址发出请求。

    • 在大多数情况下,该账号是服务账号

    • 如果您创建自己的程序来生成签名网址,则可以使用用户账号(前提是该账号具有关联的 HMAC 密钥)。

生成签名网址后,拥有该网址的任何人都可以使用该网址,在指定的时间段内执行指定的操作(例如读取对象)。

什么时候应使用签名网址?

在某些情况下,您可能希望您的用户无需拥有 Google 账号便可访问 Cloud Storage,不过您仍然想要根据应用的实际情况来控制访问权限。在这种使用情景下,较为典型的做法是向用户提供允许其在有限时间内对该资源拥有读取、写入或删除权限的签名网址。您需要在创建签名网址时指定到期时间。在该网址到期之前或用于对该网址进行签名的密钥被轮替之前,知道该网址的任何人都可以访问资源。

签名网址最常见的用途是上传和下载,因为在此类请求中,对象数据会在请求者与 Cloud Storage 之间移动。在大多数其他情况下,例如复制对象、编写对象、删除对象或修改元数据,创建一个签名网址并将其提供给他人使用,是不必要的额外步骤。您应改为考虑一项设计,让创建签名网址的实体直接向 Cloud Storage 发出所需请求。

用于生成签名网址的选项

Cloud Storage 支持多种生成签名网址的方法:

  • 使用服务账号身份验证进行 V4 签名:此签名机制将在下文中介绍。

  • 使用 HMAC 身份验证执行签名:如果您是 Amazon Simple Storage Service (Amazon S3) 用户,您可以使用现有的工作流生成 Cloud Storage 签名网址。只需指定 Cloud Storage 资源,指向主机 storage.googleapis.com,并在生成签名网址的过程中使用 Cloud Storage HMAC 凭据。

签名网址示例

以下示例展示如何遵循“使用服务账号身份验证执行 V4 签名流程”创建签名网址:

https://storage.googleapis.com/example-bucket/cat.jpeg?X-Goog-Algorithm=
GOOG4-RSA-SHA256&X-Goog-Credential=example%40example-project.iam.gserviceaccount.com
%2F20181026%2Fus-central1%2Fstorage%2Fgoog4_request&X-Goog-Date=20181026T18
1309Z&X-Goog-Expires=900&X-Goog-SignedHeaders=host&X-Goog-Signature=247a2aa45f16
9edf4d187d54e7cc46e4731b1e6273242c4f4c39a1d2507a0e58706e25e3a85a7dbb891d62afa849
6def8e260c1db863d9ace85ff0a184b894b117fe46d1225c82f2aa19efd52cf21d3e2022b3b868dc
c1aca2741951ed5bf3bb25a34f5e9316a2841e8ff4c530b22ceaa1c5ce09c7cbb5732631510c2058
0e61723f5594de3aea497f195456a2ff2bdd0d13bad47289d8611b6f9cfeef0c46c91a455b94e90a
66924f722292d21e24d31dcfb38ce0c0f353ffa5a9756fc2a9f2b40bc2113206a81e324fc4fd6823
a29163fa845c8ae7eca1fcf6e5bb48b3200983c56c5ca81fffb151cca7402beddfc4a76b13344703
2ea7abedc098d2eb14a7

此签名网址提供了存储桶 example-bucket 中的对象 cat.jpeg 的读取访问权限。使此网址成为签名网址的查询参数为:

  • X-Goog-Algorithm:用于对网址进行签名的算法。

  • X-Goog-Credential:用于创建签名网址的凭据信息。

  • X-Goog-Date:可以开始使用该签名网址的日期和时间(采用 ISO 8601 基本格式 YYYYMMDD'T'HHMMSS'Z')。

  • X-Goog-Expires:签名网址的有效时长(从 X-Goog-Date 中的值开始算起,以秒为单位)。在此示例中,签名网址会在 15 分钟后到期。最长到期值为 604800 秒(7 天)。

  • X-Goog-SignedHeaders:使用签名网址的请求中必须包含的标头。

  • X-Goog-Signature:允许使用此签名网址来请求访问 cat.jpeg 的身份验证字符串。

将签名网址与可续传上传结合使用

通常,无需为可续传上传创建签名网址,因为在启动上传的请求之后,上传对象数据的后续 PUT 请求会使用会话 URI,该 URI 充当身份验证令牌。这意味着 PUT 请求不会使用任何签名网址。

虽然您可以为初始 POST 请求创建和使用签名网址来启动上传,但在大多数情况下,服务器可以改为启动可续传上传。然后,服务器将会话 URI 发送给客户端以执行上传。这样可以避免让服务器创建签名网址的复杂性,以及让客户端处理签名网址并发起可续传上传的复杂性。

与签名网址一样,拥有会话 URI 的所有人都可以使用会话 URI 上传数据。在将会话 URI 提供给客户端时,务必通过 HTTPS 传输会话 URI。

签名网址注意事项

使用签名网址时,请注意以下事项:

  • 签名网址只能用于通过 XML API 端点访问 Cloud Storage 资源。

  • 通常可以针对任何 XML API 请求创建签名网址;但以下两种例外情况:

    • 使用 V4 签名的签名网址不能在正文使用分块编码的请求中使用。

    • Node.js Cloud Storage 客户端库目前只能为个别对象创建签名网址。例如,不能使用此客户端库来创建用于在存储桶中列出对象的签名网址。

  • 指定凭据时,建议您使用电子邮件地址标识服务账号;但也支持使用服务账号 ID。

  • 请务必省略任何使用签名网址的请求中的授权标头。如果两者都使用,则 Cloud Storage 可以针对标头(而不是签名网址)中提供的凭据进行身份验证。这样做可能会使对资源的访问权限超出您的预期。

规范化请求

签名网址将规范化请求用作其 X-Goog-Signature 查询字符串参数中编码的信息的一部分。使用 Cloud Storage 工具创建签名网址时,所需的规范化请求会随之自动创建并添加。但是,当您使用自己的程序创建签名网址时,需要自行定义规范化请求,并使用该请求创建签名

凭据范围

凭据范围显示在要签名的字符串和 X-Goog-Credential 查询字符串参数中。

后续步骤