

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 计算 Amazon SWF 的 HMAC-SHA 签名
<a name="HMACAuth-swf"></a>

发给 Amazon SWF 的每个请求都必须进行身份验证。会 Amazon SDKs 自动签署您的请求并管理基于令牌的身份验证。但是，如果要写入自己的 HTTP `POST` 请求，在对请求进行身份验证时，您需要为 HTTP `POST Header` 内容创建 `x-amzn-authorization` 值。

有关对标头进行格式设置的详细信息，请参阅 [HTTP 标头内容](UsingJSON-swf.md#HTTPHeader)。有关 Amazon 版本 3 签名的 适用于 Java 的 Amazon SDK 实现，请参阅 [ AWSSigner.java](https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/auth/AWS3Signer.java) 类。

## 创建请求签名
<a name="AuthProcess"></a>

在创建 HMAC-SHA 请求签名之前，必须获取 Amazon 凭证（访问密钥 ID 和私有密钥）。

**重要**  
您可以使用 SHA1 或 SHA256 来签署您的请求。但是，请务必在整个签名过程中使用同一方法。您选择的方法必须与 HTTP 标头中的 `Algorithm` 名称的值匹配。

### 创建请求签名
<a name="swf-create-request-signature-steps"></a>

1. 创建一个标准化的 HTTP 请求标头。HTTP 标头规范形式包括以下内容：
   + `host`
   + 以 `x-amz-` 为开头的任何标头元素

   有关所包含的标头的详细信息，请参阅 [HTTP 标头内容](UsingJSON-swf.md#HTTPHeader)。

   1. 对于每一个标头名值对，将标头名称转换为小写字母 (但不是标头值)。

   1. 将标头名称映射到逗号分隔的标头值。

      ```
      x-amz-example: value1
      x-amz-example: value2  =>  x-amz-example:value1,value2
      ```

      有关更多信息，请参阅 [RFC 2616 的第 4.2 节](http://tools.ietf.org/html/rfc2616)。

   1. 对于每个标头名称-值对，将其转换成 `headerName:headerValue` 格式的字符串。从 `headerName` 和 `headerValue` 的开头和结尾删除所有空白，冒号两边不留空格。

      ```
      x-amz-example1:value1,value2
      x-amz-example2:value3
      ```

   1. 在转换好的每一个字符串 (包括最后一个字符串) 后插入一个换行符 (`U+000A`)。

   1. 按照字母顺序用标头名称给转换好的字符串集合分类。

1. 创建包含以下项目的 string-to-sign值：
   + 第 `1` 行：HTTP 方法 (`POST`)，其后是换行符。
   + 第 `2` 行：请求 URI (`/`)，其后是换行符。
   + 第 `3` 行：空字符串，其后是换行符。
**注意**  
通常，这里会显示查询字符串，但 Amazon SWF 不使用查询字符串。
   + 第 `4–n` 行：表示步骤 1 中计算的规范请求标头的字符串，后跟换行符。该换行符在 HTTP 请求的标头与正文之间创建一个空白行。有关更多信息，请参见 [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html)。
   + 请求正文，*不* 跟换行符。

1. 计算 string-to-sign值的 SHA256 或 SHA1 摘要。在整个过程中采用同一种 SHA 方法。

1. 使用 API 操作使用上一步生成的值和来自 Amazon 安全令牌服务的临时私有访问密钥的 SHA1 摘要（取决于您使用的方法）计算并对 HMAC-SHA 进行编码。 SHA256 `[GetSessionToken](https://docs.amazonaws.cn/STS/latest/UsingSTS/CreatingSessionTokens.html)`
**注意**  
Amazon SWF 希望在进行 Base64 编码的 HMAC-SHA 值末尾添加一个等号 (`=`)。如果 Base64 编码程序不包括附加等号，请在值的结尾附加一个等号。

   有关在 Amazon SWF 和其他 Amazon 服务中使用临时安全证书的更多信息，请参阅 IAM *用户*指南中的[与 IAM 配合使用的Amazon 服务](https://docs.amazonaws.cn/STS/latest/UsingSTS/UsingTokens.html)。

1. 将生成的值作为 `Signature` 名称的值放入向 Amazon SWF 发送的 HTTP 请求的 `x-amzn-authorization` 标头中。

1. Amazon SWF 会验证该请求并执行指定操作。