Python 签署SimpleDB请求
我试图用Python对Amazon的SimpleDB服务进行API调用。例如,我使用的是最简单的请求,Python 签署SimpleDB请求,python,amazon-simpledb,Python,Amazon Simpledb,我试图用Python对Amazon的SimpleDB服务进行API调用。例如,我使用的是最简单的请求,ListDomains。然而,无论我尝试什么,响应总是“我们计算的请求签名与您提供的签名不匹配。” 这是我正在签名的字符串(根据): 我用HmacSHA256和HmacSHA1都试过了。似乎什么都不管用。我做错了什么?我不会重新发明轮子-有几个python simpledb库,如 如果没有其他问题的话,他们的签名代码应该会澄清您的错误,但是认真地说,使用现有的维护API,这将使您的生活更
ListDomains
。然而,无论我尝试什么,响应总是“我们计算的请求签名与您提供的签名不匹配。”
这是我正在签名的字符串(根据):
我用HmacSHA256和HmacSHA1都试过了。似乎什么都不管用。我做错了什么?我不会重新发明轮子-有几个python simpledb库,如
如果没有其他问题的话,他们的签名代码应该会澄清您的错误,但是认真地说,使用现有的维护API,这将使您的生活更加轻松。一个关键问题是您必须正确地对所有HTTP参数值进行URL编码 以下文档已从SimpleDB文档中消失,但可以在SQS文档中找到,并且仍然与SimpleDB非常相关: 不要对任何 RFC 3986中包含的未保留字符 定义 这些未保留的字符是A-Z, a-z,0-9,连字符(-),下划线(_ )、句号(.)和波浪号(~) 百分比编码所有其他字符 对于%XY,其中X和Y为十六进制 字符0-9和大写字母A-F 百分比编码扩展UTF-8 格式为%XY%ZA的字符 百分比将空格字符编码为 %20(和非+,作为通用编码 计划(确实如此) 您会注意到,在Roger链接的
python simpledb
模块中,它们在形成请求时遵循以下规则:
def escape(s):
return urllib.quote(s, safe='-_~')
def urlencode(d):
if isinstance(d, dict):
d = d.iteritems()
return '&'.join(['%s=%s' % (escape(k), escape(v)) for k, v in d])
实际上,我正在为另一种语言编写一个SimpleDB模块,并使用Python作为起点来找出我的错误所在。但是谢谢你的提示。很酷-从来没有听说过这个,令人惊讶的是有多少种语言,而实际上你可以用Perl做任何事情;-)实际上,不开玩笑,您可能会发现Perl SimpleDB库也很有用——可能有比Python变体更成熟的解决方案。请确保您正确地对所有HTTP参数值进行URL编码。
import base64,hashlib,hmac,time
# Sign the request
signature = hmac.new(
key=AWS_SECRET_ACCESS_KEY,
msg=string_to_sign,
digestmod=hashlib.sha1).digest()
# Base64 encode the signature
signature = base64.encodestring( signature )
def escape(s):
return urllib.quote(s, safe='-_~')
def urlencode(d):
if isinstance(d, dict):
d = d.iteritems()
return '&'.join(['%s=%s' % (escape(k), escape(v)) for k, v in d])