Amazon Web Services
一般参考 (Version 1.0)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

任务 4:将签名信息添加到请求

在计算签名后,将它添加到请求。您可以通过以下两种方式之一将签名信息添加到请求:

  • 名为 Authorization 的 HTTP 标头

  • 查询字符串

您不能同时在 Authorization 标头和查询字符串中传递签名信息。

注意

您可以使用 AWS Security Token Service (AWS STS) 提供的临时安全凭证对请求进行签名。此过程与使用长期凭证相同,但是需要安全令牌的额外 HTTP 标头或查询字符串参数。标头的名称或查询字符串参数为 X-Amz-Security-Token,值为会话令牌(在您获取临时安全凭证时从 AWS STS 收到的字符串)。

X-Amz-Security-Token 参数添加到查询字符串时,一些服务需要您将此参数包括在规范(签名)请求中。对于其他服务,您在计算签名之后,需要在末尾添加此参数。有关详细信息,请参阅该服务的 API 参考文档。

将签名信息添加到 Authorization 标头

通过将签名信息添加到名为 Authorization 的 HTTP 标头,可以包括签名信息。此标头内容是在按前面的步骤所述计算签名之后创建的,因此 Authorization 标头未包含在已签名标头的列表中。尽管此标头名为 Authorization,但签名信息实际上用于身份验证。

以下伪代码说明 Authorization 标头的构造。

Copy
Authorization: algorithm Credential=access key ID/credential scope, SignedHeaders=SignedHeaders, Signature=signature

下面的示例说明一个完整的 Authorization 标头。

Copy
Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/cn-north-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=d37af66cc90dc26bb2e27d2a97316b729b82589b5e4648f1ae34cb83a3f546cd

请注意以下几点:

  • 算法和 Credential 之间没有逗号。但是,SignedHeadersSignature 使用逗号与之前的值隔开。

  • Credential 值以访问密钥 ID 开头,后跟正斜杠 (/),再接您在任务 2:创建签名版本 4 的待签字符串中计算得出的凭证值范围。秘密访问密钥用于为签名派生签名密钥,但未包含在通过请求发送的签名信息中。

将签名信息添加到查询字符串

您可以发送请求并在查询字符串中传递所有请求值,包括签名信息。这有时称为预签名 URL,因为它生成单个 URL,其中包含成功调用 AWS 所需要的一切信息。这通常在 Amazon S3 中使用。有关更多,请参阅 Amazon Simple Storage Service API Reference 中的使用查询参数对请求进行身份验证(AWS 签名版本 4)

重要

如果您发出一个请求,其中所有参数都包含在查询字符串中,则生成的 URL 表示已经进行了身份验证的 AWS 操作。因此,对待生成的 URL 要像对待实际凭证一样小心。建议您使用 X-Amz-Expires 参数为请求指定较短的过期时间。

如果使用这种方法,所有查询字符串值(签名除外)都将包含在规范查询字符串中,该字符串是您在签名过程第一部分中构造的规范查询的一部分。

以下伪代码说明包含所有请求参数的查询字符串的构造。

Copy
querystring = Action=action querystring += &X-Amz-Algorithm=algorithm querystring += &X-Amz-Credential= urlencode(access_key_ID + '/' + credential_scope) querystring += &X-Amz-Date=date querystring += &X-Amz-Expires=timeout interval querystring += &X-Amz-SignedHeaders=signed_headers

在计算签名(使用其他查询字符串值作为计算的一部分)后,请将该签名作为 X-Amz-Signature 参数添加到查询字符串中:

Copy
querystring += &X-Amz-Signature=signature

下面的示例说明当所有请求参数和签名信息都包括在查询字符串参数中时请求看起来是什么样。

Copy
https://iam.cn-north-1.amazonaws.com.cn?Action=ListUsers&Version=2010-05-08&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fcn-north-1%2Fiam%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=60&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Signature=bbb7890b2172f0cccc6d1d5cded4e690f3e1dac299599547f3d1ceb50567e83d

请注意以下几点:

  • 为计算签名,查询字符串参数必须按代码点的从低到高的顺序排序,并且其值必须是 URI 编码的值。请参阅任务 1:针对签名版本 4 创建规范请求中有关创建规范查询字符串的步骤。

  • 将超时间隔 (X-Amz-Expires) 设置为您所请求的操作的最短可行时间。