创建StringToSign

时间:2011-09-03 01:55:49

标签: python amazon-s3

我正在阅读将查询字符串传递给亚马逊S3进行身份验证的文档,并且似乎无法确定如何创建和使用StringToSign。我正在寻找一个具体的例子来说明(1)如何构造StringToSign,以及(2)一旦我有签名,如何调用表单。

例如,让我们说以下是我的信息:

Content-type='image/jpeg'
Bucket='test-bucket'
Key = 'filename'
ACL = 'public-read'
Expiration = '(never expires)'
Access Key = '12345'
Secret Password = '1a2b3c'
File = <file the user uploads>

我如何从中获取StringToSign值?一旦我有了这个,我将如何创建以下形式:

<form action="??" method="post" enctype='multipart/form-data' class="upload-form">
    <input name="file" type="file"> 
</form>

供参考:http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAuthentication.html#RESTAuthenticationQueryStringAuth。谢谢。

1 个答案:

答案 0 :(得分:2)

根据您的描述,您似乎希望使用POST支持基于浏览器的上传。有section of the AWS documentation which talks about this

作为概述,请记住,您必须使您的存储桶可以公开写入或包含策略文档。我假设您将包含一份政策文件(如果您不愿意,请查看文档):

策略文档只是JSON的一个片段,用于对请求进行身份验证,并提供在上载数据之前必须满足的一系列条件。 E.g:

"expiration": "2020-12-01T12:00:00.000Z",
"conditions": [
    {"acl": "public-read" },
    {"bucket": "test-bucket" },
    ["eq", "$key", "filename"],
  ]
}

这表示上传的操作将被允许到2020年,因为该存储桶只能公开读取,存储桶名称为“test-bucket”,密钥完全等于“filename”。

现在,要构建您的签名,您需要使用上面的JSON文档,UTF-8对其进行编码,然后对其进行编码,然后使用您的秘密访问密钥(使用hmac sha1)签署整个内容,最后使用base64整个内容

policy_data = ... # stuff above
enc_policy = base64.b64_encode(policy_data.encode('utf8'))
signed = base64.b64_encode(hmac.new(AWS_SECRET, enc_policy, hashlib.sha1))

最后,您的表单看起来像这样:

 <form action="http://test-bucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
    Key to upload: <input type="input" name="key" value="filename" /><br />
    <input type="hidden" name="acl" value="public-read" />
    <input type="hidden" name="success_action_redirect" value="http://test-bucket.s3.amazonaws.com/successful_upload.html" />
    Content-Type: <input type="input" name="Content-Type" value="image/jpeg" /><br />
    <input type="hidden" name="AWSAccessKeyId" value="YOUR_ACCESS_KEY_ID" />
    <input type="hidden" name="Policy" value="<enc_policy from above>" />
    <input type="hidden" name="Signature" value="<signed from above>" />
    File: <input type="file" name="file" /> <br />
    <!-- The elements after this will be ignored -->
    <input type="submit" name="submit" value="Upload to Amazon S3" />
  </form>