【问题标题】:Signing a SimpleDB request签署 SimpleDB 请求
【发布时间】:2011-04-19 18:55:14
【问题描述】:

我正在尝试使用 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 编码。

标签: python amazon-simpledb


【解决方案1】:

一个关键问题是您必须正确地对所有 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])

【讨论】:

    【解决方案2】:

    我不会重新发明轮子 - 有几个 python simpledb 库,例如;

    如果不出意外,他们的签名代码应该能说明你的错误是什么,但说真的,使用现有维护的 API,它会让你的生活更轻松。

    【讨论】:

    • 我实际上正在为另一种语言编写一个 SimpleDB 模块,并使用 Python 作为开始找出我的错误所在。但感谢您的提示。
    • 酷 - 从来没有听说过那个,令人惊讶的是有多少种语言实际上你可以在 Perl 中做任何事情 ;-) 实际上,除了开玩笑,你可能会发现 Perl SimpleDB 库也很有用 - 有可能比 Python 变体更成熟的解决方案。
    猜你喜欢
    • 2021-11-03
    • 2019-03-25
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2021-06-03
    • 2017-11-06
    • 2014-09-26
    相关资源
    最近更新 更多