我想创建一个所谓的“预签名”URL,用于将特定对象(PUT)上传到Amazon S3存储桶。
到目前为止一切顺利。我正在使用python库boto来创建一个URL,其中包含所有必需的东西(过期,签名等)。 URL如下所示:
https://<bucketname>.s3.amazonaws.com/<key>?Signature=<sig>&Expires=<expires>&AWSAccessKeyId=<my key id>&x-amz-acl=public-read
注意最后一个参数。
至少,正如我所理解的那样,这限制了使用此URL将对象上传到特定存储桶中的特定键的人,并且还将将在对象上设置的固定ACL限制为“公共读取”。 / p>
我的上一个陈述是非常不正确的。
事实证明,如果您使用此网址,则可以使用x-amz-acl 标头执行以下操作(而不是查询字符串参数具有相同名称,您必须设置签名检查才能成功):
所以看来,
x-amz-acl=public-read
,则可以将x-amz-acl
标头设置为authenticated-read
,而不是公共可读对象获取对象,只能通过身份验证读取用户。 x-amz-acl QS参数与标题之间的真实关系是什么?有没有办法限制对象的权限,即通过PUT
请求上传到所谓的“预签名”URL?
答案 0 :(得分:4)
据我了解(我可能在这里错了),标题x-amz-acl
优先于querystring参数 - 它们的作用相同。在签名检查期间仅考虑querystring参数的原因仅仅是因为标头不是策略签名检查的一部分。
This page可能对您有所帮助;在创建直接上传到S3的表单时,它帮了我很多忙。
答案 1 :(得分:-1)
您似乎使用了错误的acl参数名称。根据他们的签名请求指南,尝试使用acl:
Signing and Authenticating REST Requests
如果请求解决了子资源,例如?版本控制,?位置,?acl,?torrent,?lifecycle或?versionid附加子资源,其值(如果有)和问号。请注意,在多个子资源的情况下,子资源必须按子资源名称按字典顺序排序,并以“&amp;”分隔。例如?ACL&安培; VERSIONID =值
构造CanonicalizedResource元素时必须包含的子资源列表包括:acl,生命周期,位置,日志记录,通知,partNumber,策略,requestPayment,torrent,uploadId,uploads,versionId,版本控制,版本和网站。