签名网址

本页面提供签名网址的概览。借助签名网址,您可向他人提供带有时限的资源访问权限,而无论对方是否拥有 Google 帐号。要了解如何创建签名网址,请参阅使用 Cloud Storage 工具执行 V4 签名流程使用自己的程序执行 V4 签名流程。要了解如何以其他方式控制存储分区和对象的访问权限,请参阅访问权限控制概览

概览

签名网址提供有限的权限和时间用于发出请求。签名网址的查询字符串中包含身份验证信息,这样,用户无需凭据也可对资源执行特定操作。生成签名网址时,您需要指定用户或服务帐号,且该用户或服务帐号具有的权限必须足以支持签名网址发出请求。生成签名网址后,拥有该网址的任何人都可以使用该网址,在指定的时间段内执行指定的操作(例如读取对象)。

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

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

用于生成签名网址的选项

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

  • 使用服务帐号身份验证执行 V4 签名测试版:此签名机制将在下文中介绍。

  • 使用服务帐号身份验证执行 V2 签名:如需详细了解此签名机制,请点击此处

  • 使用 HMAC 身份验证执行签名:如果您是 Amazon Simple Storage Service (Amazon S3) 用户,您可以使用现有的工作流生成 Cloud Storage 签名网址。只需指定 Cloud Storage 资源,指向主机 storage.googleapis.com,并在生成签名网址的过程中使用 Google 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-central-1%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 中的值开始算起,以秒为单位)。

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

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

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

利用签名网址与可续传上传来上传对象至存储分区时,您只需在初始 POST 请求中使用签名网址。POST 请求中不会上传任何数据;它只返回一个会话 URI,后续 PUT 请求使用该 URI 上传数据。会话 URI 实际上是一个身份验证令牌,因此 PUT 请求无需使用原始签名网址。此举允许服务器发出 POST 请求,这样,客户端就不需要自行处理签名网址了。

可续传上传被固定在启动上传操作的区域中。例如,如果您在美国创建一个可续传上传网址,并将其提供给亚洲的客户,则上传仍会经由美国区域进行。如果执行可续传上传的区域并非是启动上传操作的区域,可能会导致上传速度变慢。要避免这种情况,可通过服务器构建并签署初始 POST 请求,然后将签名网址提供给客户端,以便从其所在位置启动上传。启动后,客户端可以正常使用生成的会话 URI 来发出不需要签名的 PUT 请求。

签名网址注意事项

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

  • 通常可以针对任何 XML API 请求创建签名网址;但是,Node.js Cloud Storage 客户端库当前只能为单独对象创建签名网址。例如,不能使用此客户端库来创建用于在存储分区中列出对象的签名网址。

  • 当前,Python 和 Go Cloud Storage 客户端库不支持 V4 签名网址。

  • response-content-dispositionresponse-content-type 之类的查询字符串参数不能通过签名进行验证。要在响应中强制使用内容-处置或内容-类型,请在对象元数据中设置这些参数

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

规范化请求

规范化请求定义用户在使用签名网址时必须发出的请求,其中包含使用签名网址的请求中必须使用的信息(例如 HTTP 动词、查询字符串参数和标头),以及签名网址授予访问权限的对象、存储分区或其他资源。

HTTP 动词

签名网址可与下列 HTTP 动词结合使用:

  • DELETE
  • GET
  • HEAD
  • PUT
  • POST(当与可续传上传结合使用时)。

资源路径

包含在规范化请求中的路径,此路径指向签名网址要应用于的资源。资源路径是位于主机名之后,查询字符串之前的所有内容。

例如,如果 Cloud Storage 网址是 https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg?userProject=my-project,则资源路径是 /example-bucket/cat-pics/tabby.jpeg

如果您使用 https://example-bucket.storage.googleapis.com/cat-pics/tabby.jpeg?userProject=my-project 等备用 Cloud Storage 网址,则资源路径是 /cat-pics/tabby.jpeg

如需了解可与签名网址一起使用的其他网址端点,请参阅 XML API 请求端点

定义资源路径时,您必须对以下预留字符执行百分比编码?=!#$&'()*+,:;@[]."。此外,网址中使用的所有其他百分比编码都应包含在资源路径中。

查询字符串

包含在规范化请求中的查询字符串参数必须是使用签名网址的请求的一部分。查询字符串是资源路径末尾问号 (?) 后面的内容。

例如,如果 Cloud Storage 网址是 https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg?userProject=my-project,则查询字符串是 userProject=my-project

在规范化请求中,查询字符串必须使用按字典顺序排序的代码点值,按名称为所有参数排序,且所有参数都应该用 & 分隔。

必需的查询字符串参数

许多查询字符串参数(例如 alt)可根据需要添加,但以下查询字符串参数在每个签名网址中都必不可少:

  • X-Goog-Algorithm:用于对网址进行签名的算法。有效值为 GOOG4-RSA-SHA256GOOG4-HMAC-SHA256
  • X-Goog-Credential:用于对网址进行签名的凭据。这些凭据包含采用以下格式提供的授权方和凭据范围[AUTHORIZER]%2F[CREDENTIAL_SCOPE]。授权方可以是服务帐号名称或 HMAC 访问密钥。
  • X-Goog-Date:采用 ISO 8601 基本格式 YYYYMMDD'T'HHMMSS'Z' 的当前日期和时间。
  • X-Goog-Expires:从 X-Goog-Date 开始的签名网址生命周期(以秒为单位)。
  • X-Goog-SignedHeaders:一个以英文分号分隔的标头名称列表,所列标头必须包含在使用签名网址的请求中。host 必须是这些标头的其中之一。
  • X-Goog-Signature:对请求进行身份验证的签名。

标头

包含在规范化请求中的标头必须是使用签名网址的请求的一部分,其中包括自定义标头和以 x-goog 开头的扩展标头。您可以在规范化请求的以下几个部分中指定标头:

  1. X-Goog-SignedHeaders 查询字符串参数中指定标头名称,各个名称用 ; 分隔。
  2. 在规范化请求查询字符串部分的后面指定标头 name:value,各对标头用换行符 (\n) 分隔。
  3. 在标头 name:value 对列表后面的新行中指定标头名称,各个名称用 ; 分隔。

指定标头的 name:value 对时,请注意以下事项:

  • 将所有标头名称都设为小写。
  • 使用按字典顺序排序的代码点值,按标头名称对所有标头排序。
  • 创建一个标头名称(带有英文逗号分隔的值列表),以消除重复标头名称。确保值之间没有空格,并确保英文逗号分隔列表的顺序与标头在请求中显示的顺序匹配。如需了解详情,请参阅 RFC 7230 第 3.2 节
  • 将折叠空格或换行符(CRLF 或 LF)替换为一个空格。如需详细了解折叠空格,请参阅 RFC 7230 第 3.2.4 节
  • 移除标头名称后面出现的冒号周围的所有空格。

    例如,如果在冒号后面使用自定义标头 x-goog-acl: private,但又没有移除空格,则会返回 403 Forbidden 错误,因为您计算的请求签名与 Google 计算的签名不匹配。

例如,如果您拥有以下标头组:

host: storage.googleapis.com
content-type: text/plain
x-goog-meta-reviewer: jane
x-goog-meta-reviewer: john

规范化请求中的构造将是:

content-type:text/plain
host:storage.googleapis.com
x-goog-meta-reviewer:jane,john

必需标头

content-type 和扩展标头等大多数标头均可根据需要添加,但以下标头在每个签名网址中必不可少:

  • host:用于访问 Cloud Storage 的 URI。

此外,除非已在规范化请求中明确指定,否则以下标头不能用在使用签名网址的请求中。

  • x-goog-project-id
  • x-goog-copy-source
  • x-goog-metadata-directive
  • x-amz-copy-source
  • x-amz-metadata-directive

凭据范围

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

[DATE]/[LOCATION]/storage/goog4_request
  • [DATE]:采用 YYYYMMDD 格式的日期,该日期必须与要签名的字符串中使用的日期相匹配。
  • [LOCATION]:资源所在的区域或将在其中创建资源的区域。对于 Cloud Storage 资源,[LOCATION] 的值为任意值:[LOCATION] 参数存在的意义是保持与 Amazon Simple Storage Service (Amazon S3) 的兼容性。
  • storage:服务名称。
  • goog4_request:签名网址的类型。

示例:20181102/us/storage/goog4_request

使用 Google Cloud Platform 工具对字符串签名

使用程序生成签名网址时,可利用 GCP 提供的工具对字符串签名。

App Engine 应用身份服务

App Engine 应用内的签名使用 App Engine 身份服务,该服务使用 App Engine 服务帐号凭据。例如,借助 Python App Identity API,您可以执行以下操作:

  • 使用 google.appengine.api.app_identity.sign_blob() 从您构造的字符串中对字节签名,然后在组合签名网址时提供所需的 Signature

  • 使用 google.appengine.api.app_identity.get_service_account_name() 检索服务帐号名称(这是您在组合签名网址时需要用到的 GoogleAccessId)。

App Engine 还以另外几种语言提供支持:

App Identity 服务在签署 blob 时会轮替私钥。从 App Identity 服务生成的签名网址至少可以使用一小时,而且最适合短期访问资源。

IAM signBlob

可以使用 IAM signBlob 方法实现签名。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Cloud Storage
需要帮助?请访问我们的支持页面