

# 对请求进行身份验证：使用 POST 的基于浏览器的上传（AWS 签名版本 4）
<a name="sigv4-authentication-HTTPPOST"></a>

Amazon S3 支持 HTTP POST 请求，以便用户可以直接将内容上传到 Amazon S3。使用 HTTP POST 上传内容可简化上传并减少上传延迟，适用于用户将数据上传至 Amazon S3 中进行存储的情况。本节说明如何对 HTTP POST 请求进行身份验证。有关 HTTP POST 请求、如何创建表单、创建 POST 策略以及示例的更多信息，请参阅[使用 POST 的基于浏览器的上传（AWS 签名版本 4）](sigv4-UsingHTTPPOST.md)。

要对 HTTP POST 请求进行身份验证，请执行以下操作：

 

1. 表单必须包含以下字段，以提供签名和相关信息，供 Amazon S3 用于在收到请求时重新计算签名：


<table>
<thead>
  <tr><th>元素名称</th><th>说明</th></tr>
</thead>
<tbody>
  <tr><td><code>policy</code></td><td>以 Base64 编码的安全策略，用于描述请求中允许的内容。对于签名计算，此策略是您签名的字符串。Amazon S3 必须获取此策略，这样它才能重新计算签名。</td></tr>
  <tr><td><code>x-amz-algorithm</code></td><td>使用的签名算法。对于 AWS 签名版本 4，该值为 <code>AWS4-HMAC-SHA256</code>。</td></tr>
  <tr><td><code>x-amz-credential</code></td><td>除了访问密钥 ID 外，此元素还提供用于计算签名密钥的范围信息，以便进行签名计算。<br />它是采用以下形式的字符串：<br /><code>&lt;your-access-key-id&gt;/&lt;date&gt;/&lt;aws-region&gt;/&lt;aws-service&gt;/aws4_request </code><br />例如：<br /> <code> AKIAIOSFODNN7EXAMPLE/20130728/us-east-1/s3/aws4_request</code>. . <br />对于 Amazon S3，<i>aws-service</i> 字符串为 <code>s3</code>。有关 Amazon S3 <code>aws-region</code> 字符串的列表，请参阅《AWS 一般参考》<i></i>中的<a href="https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region">区域和端点</a>。</td></tr>
  <tr><td><code>x-amz-date</code></td><td>它是采用 ISO8601 格式的日期值。例如 <code>20130728T000000Z</code>。<br />它与您创建签名密钥时使用的日期相同。该值也必须与您在签名的策略 (<code>x-amz-date</code>) 中提供的值相同。</td></tr>
  <tr><td><code>x-amz-signature</code></td><td>（AWS 签名版本 4）安全策略的 HMAC-SHA256 哈希值。<br />有关签名的选项的更多信息，请参阅《AWS 一般参考》<i></i>中的<a href="https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html">将签名添加到 HTTP 请求</a>。</td></tr>
</tbody>
</table>


1. POST 策略必须包含以下元素：


<table>
<thead>
  <tr><th>元素名称</th><th>说明</th></tr>
</thead>
<tbody>
  <tr><td><code>x-amz-algorithm</code></td><td> 用于计算签名的签名算法。对于 AWS 签名版本 4，该值为 <code>AWS4-HMAC-SHA256</code>。</td></tr>
  <tr><td><code>x-amz-credential</code></td><td>除了访问密钥 ID 外，此元素还提供用于计算签名密钥的范围信息，以便进行签名计算。<br />它是采用以下形式的字符串：<br /><code>&lt;your-access-key-id&gt;/&lt;date&gt;/&lt;aws-region&gt;/&lt;aws-service&gt;/aws4_request </code><br />例如，<br /> <code> AKIAIOSFODNN7EXAMPLE/20130728/us-east-1/s3/aws4_request</code>. . </td></tr>
  <tr><td><code>x-amz-date</code></td><td> 以 ISO8601 格式字符串指定的日期值。例如，“20130728T000000Z”。该日期必须与您在创建用于计算签名的签名密钥时使用的日期相同。</td></tr>
</tbody>
</table>


1. 对于签名计算，POST 策略是待签字符串。

## 计算签名
<a name="sigv4-signature-calc-post"></a>

 下图说明了签名计算过程。

![AWS 签名计算过程，包含 StringToSign、SigningKey 和 Signature 步骤。](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/developerguide/images/sigV4-post.png)






**计算签名**

1. 使用 UTF-8 编码创建策略。

1. 将 UTF-8 编码的策略转换为 Base64。结果是待签字符串。

1. 将签名创建为待签字符串的 HMAC-SHA256 哈希值。您将提供签名密钥作为哈希函数的密钥。

1. 使用十六进制编码对签名进行编码。

有关创建 HTML 表单、安全策略和示例的更多信息，请参阅以下子主题：


+ [创建 HTML 表单（使用 AWS 签名版本 4）](sigv4-HTTPPOSTForms.md)
+ [POST 策略](sigv4-HTTPPOSTConstructPolicy.md)
+ [示例：使用 HTTP POST 的基于浏览器的上传（使用 AWS 签名版本 4）](sigv4-post-example.md)