我正严格按照API文档上的指示进行操作,经过一番无奈之后,我终于将http://docs.amazonwebservices.com/AWSECommerceService/2011-08-01/DG/rest-signature.html上的示例中的内容直接整理到一起
我已经在几台机器上尝试了这个python脚本,并且在所有机器上都得到了相同的结果。
import hmac
from base64 import b64encode
from hashlib import sha256
secret_key = '1234567890'
to_sign = """GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=AKIAI44QH8DHBEXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06"""
print b64encode(hmac.new(secret_key, to_sign, sha256).digest())
说明说使用此请求和此密钥的签名是
Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=
,但我得到了O6UTkH+m4zAQUvB+WXUZJeA8bZcKAdkc4crKgHtbc6s=
(在任何人说什么之前:示例页面显示以65个字符包装的请求;我已经尝试过了。这没有提供解决方案,并且在签名创建说明中也没有说明。)
编辑:我找到了答案,请参阅下文。
最佳答案
好吧,看一下...文档是错误的。
我偶然发现了这个问题的旧版(几乎)副本:Calculating a SHA hash with a string + secret key in python
在示例请求页面中,看起来AWSAccessKeyId
值已从00000000000000000000
更改为AKIAI44QH8DHBEXAMPLE
。
在脚本中更新它会打印预期的键Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=
import hmac
from base64 import b64encode
from hashlib import sha256
secret_key = '1234567890'
to_sign = """GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06"""
print b64encode(hmac.new(secret_key, to_sign, sha256).digest())