View a markdown version of this page

POST 策略 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

POST 策略

使用 HTTP POST 发出经过身份验证的请求所需的策略是使用 JavaScript 对象表示法(JSON)编写的以 UTF-8 和 base64 编码的文档,该文档指定了请求必须满足的条件。根据您设计策略文档的方式,您可以对每次上传、每个用户、所有上传或根据其它可满足您需要的设计来控制访问权限粒度。

本节介绍 POST 策略。有关使用 POST 策略计算签名的示例,请参阅示例:使用 HTTP POST 的基于浏览器的上传(使用 Amazon 签名版本 4)

注意

尽管策略文档是可选的,但我们强烈建议您使用策略文档来控制请求中支持的内容。如果您将存储桶设置为可公开写入,您根本无法控制哪些用户可以向您的存储桶写入内容。

下面是 POST 策略文档的示例。

{ "expiration": "2007-12-01T12:00:00.000Z", "conditions": [ {"acl": "public-read" }, {"bucket": "johnsmith" }, ["starts-with", "$key", "user/eric/"], ] }

POST 策略始终包含 expirationconditions 元素。示例策略使用两种条件匹配类型(精确匹配和开头为匹配)。以下各节介绍了这些元素。

过期

expiration 元素以 ISO8601 GMT 日期格式指定 POST 策略的过期日期和时间。例如,2013-08-01T12:00:00.000Z 指定 POST 策略在 GMT 时间 2013 年 8 月 1 日午夜之后无效。

条件匹配

下表描述了可用于指定 POST 策略条件的条件匹配类型(将在下一节中介绍)。尽管您必须为您在表单中指定的每个表单字段指定至少一个条件,但您也可以通过为某个表单字段指定多个条件来创建更复杂的匹配条件。

条件匹配类型 说明

精确匹配

表单字段值必须与指定的值匹配。此示例指示 ACL 必须设置为公共读取:

{"acl": "public-read" }

此示例是指示 ACL 必须设置为公共读取的替代方法:

[ "eq", "$acl", "public-read" ]

Starts With

值必须以指定的值开头。本示例指示对象键必须以 user/user1 开头:

["starts-with", "$key", "user/user1/"]

与逗号分隔列表中的 Content-Type 匹配

包含逗号的 starts-with 条件的 Content-Type 值解释为列表。列表中的每个值都必须满足该条件,才能满足整个条件。例如,给定以下条件:

["starts-with", "$Content-Type", "image/"]

以下值将满足条件:

"image/jpg,image/png,image/gif"

以下值将无法满足条件:

["image/jpg,text/plain"]
注意

不管是否存在逗号,Content-Type 以外的数据元素都被视为字符串。

匹配任何内容

要配置 POST 策略以支持表单字段中的任何内容,请使用 starts-with 以及一个空值("")。此示例对于 success_action_redirect 支持任意值:

["starts-with", "$success_action_redirect", ""]

指定范围

对于接受范围的表单字段,请使用逗号来分隔上限和下限。本示例支持 1 到 10 MiB 的文件大小:

["content-length-range", 1048576, 10485760]

条件中介绍了 POST 策略中支持的特定条件。

条件

POST 策略中的 conditions 是一个对象数组,其中的每个对象均用于验证请求。您可以使用这些条件来限制请求中支持的内容。例如,前面的策略条件要求符合以下各项:

  • 请求必须指定 johnsmith 存储桶名称。

  • 对象键名称必须有 user/eric 前缀。

  • 对象 ACL 必须设置为 public-read

您在表单中指定的每个表单字段(x-amz-signaturefilepolicy 以及带有 x-ignore- 前缀的字段名称除外)都必须出现在条件列表中。

注意

在验证 POST 策略之前,表单中的所有变量都会扩展。因此,所有条件匹配都应该针对扩展的表单字段。假设您想将对象键名称限制为特定的前缀 (user/user1)。在这种情况下,您可以将键表单字段设置为 user/user1/${filename}。您的 POST 策略应为 [ "starts-with", "$key", "user/user1/" ](请勿输入 [ "starts-with", "$key", "user/user1/${filename}" ])。有关更多信息,请参阅 条件匹配

下表中介绍了策略文档条件。

元素名称 说明
acl

指定提交表单时必须使用的 ACL 值。

此条件支持下一节中讨论的精确匹配和 starts-with 条件匹配类型。

bucket

指定可接受的存储桶名称。

此条件支持精确匹配条件匹配类型。

content-length-range

已上传的内容支持的最小和最大大小。

此条件支持 content-length-range 条件匹配类型。

Cache-Control

Content-Type

Content-Disposition

Content-Encoding

Expires

特定于 REST 的标头。有关更多信息,请参阅 POST Object

此条件支持精确匹配和 starts-with 条件匹配类型。

key

可接受的键名称或已上传对象的前缀。

此条件支持精确匹配和 starts-with 条件匹配类型。

success_action_redirect

redirect

上传成功后客户端重定向到的 URL。

此条件支持精确匹配和 starts-with 条件匹配类型。

success_action_status

在未指定 success_action_redirect 的情况下,成功上传后返回到客户端的状态代码。

此条件支持精确匹配。

x-amz-algorithm

计算签名时必须使用的签名算法。对于 Amazon 签名版本 4,该值为 AWS4-HMAC-SHA256

此条件支持精确匹配。

x-amz-credential

用于计算签名的凭证。它提供访问密钥 ID 和范围信息,用于标识签名对其有效的区域和服务。这应该与您在计算签名密钥以进行签名计算时使用的范围相同。

它是采用以下形式的字符串:

<your-access-key-id>/<date>/<aws-region>/<aws-service>/aws4_request

例如:

AKIAIOSFODNN7EXAMPLE/20130728/us-east-1/s3/aws4_request

对于 Amazon S3,aws-service 字符串为 s3。有关 Amazon S3 aws-region 字符串的列表,请参阅《Amazon Web Services 一般参考》中的区域和端点。如果 POST 策略文档随请求一起提供,则此元素为必需项。

此条件支持精确匹配。

x-amz-date

以 ISO8601 格式字符串指定的日期值。例如 20130728T000000Z。该日期必须与您在创建用于计算签名的签名密钥时使用的日期相同。

如果 POST 策略文档随请求一起提供,则此元素为必需项。

此条件支持精确匹配。

x-amz-security-token

Amazon DevPay 安全令牌。

使用 Amazon DevPay 的每个请求都需要两个 x-amz-security-token 表单字段:一个用于产品令牌,一个用于用户令牌。因此,必须使用逗号来分隔值。例如,如果用户令牌是 eW91dHViZQ==,产品令牌是 b0hnNVNKWVJIQTA=,您可以将 POST 策略条目设置为:{ "x-amz-security-token": "eW91dHViZQ==,b0hnNVNKWVJIQTA=" }

有关 Amazon DevPay 的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用 DevPay

x-amz-meta-*

特定于用户的元数据。

此条件支持精确匹配和 starts-with 条件匹配类型。

x-amz-*

有关其它 x-amz-* 标头,请参阅 POST 对象(POST Object)。

此条件支持精确匹配。

注意

如果您的工具包添加了更多表单字段(例如,Flash 添加了 filename),您必须将它们添加到 POST 策略文档。如果您可以控制此功能,将 x-ignore- 添加为字段的前缀以使 Amazon S3 忽略此功能并使其不影响此功能的未来版本。

字符转义

下表介绍了 POST 策略文档中必须进行转义的字符。

转义序列 说明

\\

反斜杠

\$

美元符号

\b

退格键

\f

换页

\n

新建行

\r

回车

\t

水平选项卡

\v

垂直选项卡

\uxxxx

所有 Unicode 字符

现在,您已经熟悉了表单和策略,并了解了签名的工作原理,可以尝试使用 POST 上传示例。您需要编写代码来计算签名。该示例提供了一个示例表单和一个可用于测试签名计算的 POST 策略。有关更多信息,请参阅 示例:使用 HTTP POST 的基于浏览器的上传(使用 Amazon 签名版本 4)