Подписание запроса SimpleDB - PullRequest
1 голос
/ 19 апреля 2011

Я пытаюсь сделать API-вызов сервиса Amazon SimpleDB с Python.В качестве примера я использую самый простой запрос, ListDomains.Однако независимо от того, что я пытаюсь сделать, ответ всегда будет таким: «Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи».

Это строка, которую я подписываю (согласно документации здесь ):

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.Ничто не похоже на работу.Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Ключевая проблема заключается в том, что необходимо правильно кодировать URL-адреса всех значений параметров HTTP.

Следующая документация исчезла из документов SimpleDB, но ее можно найти в документах SQS и все еще очень актуальна.в SimpleDB:

Не кодировать URL-адреса ни один из незарезервированных символов, определенных в RFC 3986.

Эти незарезервированные символы: AZ, az, 0-9, дефис (-), подчеркивание(_), точка (.) и тильда (~).

Процентное кодирование всех других символов с% XY, где X и Y - шестнадцатеричные символы 0-9 и AF верхнего регистра.

Процент кодирования расширенных символов UTF-8 в форме% XY% ZA

Процент кодирования символа пробела как% 20 (а не +, как это делают обычные схемы кодирования).

YouОбратите внимание, что в модуле 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])
0 голосов
/ 19 апреля 2011

Я бы не стал заново изобретать колесо - есть несколько библиотек python simpledb, таких как:

Если ничто иное, их код подписи должен прояснить, в чем ваша ошибка, а если серьезно, использовать существующий поддерживаемый API, это сделает вашу жизнь намного проще.

...