Python AWS S3 POST Signing



在Python Django中,我正在实现服务器端AWS S3 POST文件上传策略和签名创建,并将其发送到客户端。通过RESTful API, iOS客户端获取值并将文件直接发送到AWS S3。我没有使用PUT,因为这最终将是多部分,并在iOS后台使用。

这篇文章类似于使用python的sigv4-post-example。就像那些回复建议的那样,我认为AWS文档是有缺陷的。所以我继续尝试使用"real"值,没有成功。

使用AWS发布在:

的示例https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

我已经成功实现了策略生成/base64编码。但是,我正在努力使签名与AWS在该示例中发布的值相匹配。我实现了- def - &- defgetsignaturekey -如AWS所示:

https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html signature-v4-examples-python

下面是有问题的代码片段,使用AWS示例中的值:

#policy_string is string version of json generated policy, working great!!
policy_bytes = policy_string.encode("utf-8")
encoded_policy = base64.b64encode(policy_bytes)
#using values provided in AWS's test case
sign_key = getSignatureKey('wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', '20151229', 'us-east-1', 's3')
signature = hmac.new(sign_key, policy_bytes, hashlib.sha256).hexdigest()
print("signature = ", signature)

生成签名:00 e98ae3199cdbfeba701f9efa66510f23f0295ab6d6f4d14202f8ef2d11956c

但是AWS发布的版本是:8 afdbf4008c03f22c2cd3cdb72e4afbb1f6a588f3255ac628749a66d7f09699e

我在签名过程中尝试了几种密钥/消息的排列,但没有进展。有人成功地使它正常工作吗?

如果有人仍然在努力使策略编码,我发现您需要以'rn' (CRLF)结束策略中的每一行。我通过将策略中的每一行逐个附加到字符串来实现它。没有json的组合。dump或pprint成功地让我找到正确的字符串结构。

使用msg字段值的编码策略固定的代码现在可以工作了。这就是修复代码行:

从- - - - - -

signature = hmac.new(sign_key, policy_bytes, hashlib.sha256).hexdigest()

-

signature = hmac.new(sign_key, encoded_policy, hashlib.sha256).hexdigest()

修复问题

相关内容

  • 没有找到相关文章

最新更新