任务 4:将签名添加到 HTTP 请求
在计算签名后,将它添加到请求。您可以通过以下两种方式之一将签名添加到请求:
-
名为
Authorization的 HTTP 标头 -
查询字符串
您不能同时在 Authorization 标头和查询字符串中传递签名信息。
您可以使用 Amazon Security Token Service (Amazon STS) 提供的临时安全证书对请求进行签名。此过程与使用长期凭证相同,但是需要安全令牌的额外 HTTP 标头或查询字符串参数。标头的名称或查询字符串参数为 X-Amz-Security-Token,值为会话令牌(在您获取临时安全凭证时从 Amazon STS 收到的字符串)。
将 X-Amz-Security-Token 参数添加到查询字符串时,一些服务需要您将此参数包括在规范(签名)请求中。对于其他服务,您在计算签名之后,需要在末尾添加此参数。有关详细信息,请参阅该服务的 API 参考文档。
将签名信息添加到 Authorization 标头
通过将签名信息添加到名为 Authorization 的 HTTP 标头,可以包括签名信息。此标头内容是在按前面的步骤所述计算签名之后创建的,因此 Authorization 标头未包含在已签名标头的列表中。尽管此标头名为 Authorization,但签名信息实际上用于身份验证。
以下伪代码说明 Authorization 标头的构造。
Authorization:algorithmCredential=access key ID/credential scope, SignedHeaders=SignedHeaders, Signature=signature
下面的示例说明一个完整的 Authorization 标头。
Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/cn-north-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=d37af66cc90dc26bb2e27d2a97316b729b82589b5e4648f1ae34cb83a3f546cd
请注意以下几点:
-
算法和
Credential之间没有逗号。但是,SignedHeaders和Signature使用逗号与之前的值隔开。 -
Credential值以访问密钥 ID 开头,后跟正斜杠 (/),再接您在任务 2:创建 Signature Version 4 的待签字符串中计算得出的凭证值范围。秘密访问密钥用于为签名派生签名密钥,但未包含在通过请求发送的签名信息中。
将签名信息添加到查询字符串
您可以发送请求并在查询字符串中传递所有请求值,包括签名信息。这有时称为预签名 URL,因为它生成单个 URL,其中包含成功调用Amazon所需要的一切信息。通常在 Amazon S3 中使用。有关更多信息,请参阅 Amazon Simple Storage Service API 参考中的使用查询参数(Amazon Signature Version 4)验证请求。
如果您发出一个请求,其中所有参数都包含在查询字符串中,则生成的 URL 表示已经过身份验证的Amazon操作。因此,对待生成的 URL 要像对待实际凭证一样小心。建议您使用 X-Amz-Expires 参数为请求指定较短的过期时间。
如果使用这种方法,所有查询字符串值(签名除外)都将包含在规范查询字符串中,该字符串是您在签名过程第一部分中构造的规范查询的一部分。
以下伪代码说明包含所有请求参数的查询字符串的构造。
querystring = Action=actionquerystring += &X-Amz-Algorithm=algorithmquerystring += &X-Amz-Credential= urlencode(access_key_ID+ '/' +credential_scope) querystring += &X-Amz-Date=datequerystring += &X-Amz-Expires=timeout intervalquerystring += &X-Amz-SignedHeaders=signed_headers
在计算签名(使用其他查询字符串值作为计算的一部分)后,请将该签名作为 X-Amz-Signature 参数添加到查询字符串中:
querystring += &X-Amz-Signature=signature
下面的示例说明当所有请求参数和签名信息都包括在查询字符串参数中时请求看起来是什么样。
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:针对 Signature Version 4 创建规范请求中有关创建规范查询字符串的步骤。
-
将超时间隔 (
X-Amz-Expires) 设置为您所请求的操作的最短可行时间。