Проблемы аутентификации HMAC API в Python
Я пытаюсь получить данные JSON из API и пытаюсь найти источник моих проблем. В настоящее время я получаю точные данные, если message = "", но пока любые непустые параметры запроса возвращают ошибку 403. Документация API запрашивает параметры для форматирования как "customerCode=XXX", и я смог создать действительные запросы в API Sandbox. Я предполагаю, что проблема где-то в функции getSignature, но я переписал ее несколькими способами, и.encode() или bytes() дают мне тот же результат. Если код выглядит согласованным и это синтаксическая ошибка с моей стороны, я могу обратиться в службу поддержки. Опять же, когда сообщение является пустой строкой, я получаю верные результаты, поэтому я озадачен. Ошибка возникает на всех проверенных страницах отчета с несколькими различными параметрами запроса, проверенными на странице. Соответствующие функции импорта здесь не вставляются, а включены в код.
#Current hash
def getSignature(message):
hashed = hmac.new(key, message.encode('utf-8') , hashlib.sha256)
return base64.b64encode(hashed.digest())
#Header per API specs
def getData(report, message):
headers = {
'Content-Type' : 'application/json',
'Accept' : 'application/json',
'api-auth-id' : api_id,
'api-auth-signature' : getSignature(message)
}
data = requests.get(url + report, headers=headers)
data = data.json()
return data
1 ответ
РЕДАКТИРОВАТЬ: я просто заметил, что message
используется только для подписи и не включается в запрос. Я думаю, что вам, вероятно, нужно что-то вроде data = requests.get(url + report, data=message, headers=headers)
,
Старая, почти наверняка неверная теория приведена ниже:
Так как это работает для пустого сообщения, я предполагаю, что это связано с байтовой кодировкой сообщения. Кодировки utf-16 или utf-32 пустого сообщения будут такими же, как кодировки utf-8, но они будут отличаться для непустых сообщений.
Так что, возможно, попробуйте message.encode('utf-16')
или же message.encode('utf-32')
? Документы API должны описывать эту деталь того, как выполняется аутентификация.
Можно ли ссылаться на документы для API или это внутреннее?