Проблемы аутентификации 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 или это внутреннее?

Другие вопросы по тегам