gpt4 book ai didi

python - 签署 SimpleDB 请求

转载 作者:行者123 更新时间:2023-12-01 06:11:20 30 4
gpt4 key购买 nike

我正在尝试使用 Python 对 Amazon 的 SimpleDB 服务进行 API 调用。例如,我使用的是最简单的请求 ListDomains。然而,无论我如何尝试,响应始终是“我们计算的请求签名与您提供的签名不匹配。”

这是我正在签名的字符串(根据 documentation here ):

GET
https://sdb.amazonaws.com/
/
AWSAccessKeyId=<redacted>&Action=ListDomains&SignatureMethod=HmacSHA1&SignatureVersion=2&Timestamp=2011-04-19T18%3A50%3A43&Version=2009-04-15

我使用以下代码对其进行签名:

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 )

我已经尝试过 HmacSHA256 和 HmacSHA1。似乎什么都不起作用。我做错了什么?

最佳答案

一个关键问题是您必须对所有 HTTP 参数值进行正确的 URL 编码。

以下文档已从 SimpleDB 文档中消失,但可以在 SQS 文档中找到,并且仍然与 SimpleDB 非常相关:

Do not URL encode any of the unreserved characters that RFC 3986 defines.

These unreserved characters are A-Z, a-z, 0-9, hyphen ( - ), underscore ( _ ), period ( . ), and tilde ( ~ ).

Percent encode all other characters with %XY, where X and Y are hex characters 0-9 and uppercase A-F.

Percent encode extended UTF-8 characters in the form %XY%ZA

Percent encode the space character as %20 (and not +, as common encoding schemes do).

您会注意到,在由 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])

关于python - 签署 SimpleDB 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5721228/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com