Где я ошибаюсь в процессе подписывания API запросов Amazon DynamoDB
Я использую продукт под названием Alteryx и пытаюсь написать макрос Alteryx, который использует API запросов Dynamodb, чтобы я мог получить доступ к своим таблицам Dynamodb из Alteryx. К сожалению, я не могу использовать один из Amazon SDK, поэтому приходится кодировать подпись API-запросов Amazon вручную / внутри Alteryx.
Я использую пример Python Post, который включен в документацию Amazon, чтобы помочь мне в этом процессе. Пример Python можно найти здесь: Пример публикации Python.
Я выполнил каждую из задач, изложенных в примере:
- Определить переменные запроса
- Создать канонический запрос
- Создать строку для подписи
- Рассчитать подпись
- Добавьте информацию для подписи в запрос и сделайте запрос.
Первоначально я получил следующую ошибку:
InvalidSignatureException","message":"Signature·expired:·20150704T101118Z·is·now·earlier·than·20150704T135625Z·(20150704T141125Z·-·15·min.)
Хотя время на моем компьютере правильное, а время, указанное в моем запросе: 101118Z, действительно было правильным, в сообщении об ошибке говорилось, что срок действия подписи истек четыре часа назад. Моя работа над этой ошибкой заключалась в том, чтобы добавить 4 часа к моей переменной (ам) даты / времени, и это, похоже, помогло.
ВОПРОС 1. Кто-нибудь знает, что вызывает эту ошибку и есть ли способ ее исправить, не добавляя 4 часа в мою переменную даты / времени. Может ли это вызвать дополнительные сложности в процессах подписывания и подписывания API-интерфейса.
После применения метода обхода даты / времени я получил новое сообщение об ошибке:
InvalidSignatureException","message":"The·request·signature·we·calculated·does·not·match·the·signature·you·provided.·Check·your·AWS·Secret·Access·Key·and·signing·method.·Consult·the·service·documentation·for·details.\n\nThe·Canonical·String·for·this·request·should·have·been\n'POST\n/\n\ncontent_type:\nhost:dynamodb.us-east-1.amazonaws.com\nx-amz-date:20150704T141834Z\nx-amz-target:DynamoDB_20120810.CreateTable\n\ncontent_type;host;x-amz-date;x-amz-target\n09a8bcdeea1d20631f887235820bbff0a614679080a2e74a89ceb1a1bcc71b44'\n\nThe·String-to-Sign·should·have·been\n'AWS4-HMAC-SHA256\n20150704T141834Z\n20150704/us-east-1/dynamodb/aws4_request\nec549e12e44faf7ee750e19b570eaf2389f82e722ae2978b535df6fd6f3df129'\n"}
Итак, затем я сравнил свой Canonical Request с тем, который указан в сообщении об ошибке. Вот что я нашел:
- Запрос был идентичен с одним исключением. Канонический запрос, представленный в сообщении об ошибке, имел заголовок content-type:, но исключал значение связанного типа контента.
- Мой канонический запрос включал заголовок и значение типа содержимого.
- Хеш параметров запроса в конце канонического запроса отлично совпал со всем остальным.
Это важно, потому что канонический запрос является входом для следующего шага процесса. Вы должны вычислить хэш-сводку sha256 канонического запроса для создания строки для подписи. Я пробовал два альтернативных подхода / обходных путей для этой проблемы:
- Сначала я использовал полученный мной канонический запрос (включая значение типа содержимого), чтобы вычислить строку для подписи. В этом случае все соответствует сообщениям об ошибках String To Sign, кроме последнего элемента: хэша канонического запроса.
- Мой следующий подход состоял в том, чтобы вычислить канонический запрос, который исключил значение типа содержимого и поэтому точно соответствовал каноническому запросу, включенному в сообщение об ошибке. В этом сценарии производное String To Sign отлично совпало, за исключением хэша канонического запроса.
ВОПРОС 2: Кто-нибудь сталкивался с этой ошибкой; Вы знаете причину и / или у вас есть обходной путь.
Я надеюсь, что когда я смогу ответить на вопрос 3, я смогу успешно выполнить четвертое задание, вычислить подпись и успешно сделать запрос API.
ВОПРОС 3: Кто-нибудь знает о каких-либо других ошибках в этом процессе или есть какие-либо дополнительные предложения или идеи.
1 ответ
Если у вас нет особых причин делать это вручную, стандартный совет - использовать boto для доступа к AWS из Python.
РЕДАКТИРОВАТЬ: В более общем смысле, стандартный совет заключается в использовании доступных библиотек, где они будут соответствовать вашему варианту использования.
РЕДАКТИРОВАТЬ 2: См комментарии о sys.path
и обходные пути для вашего случая.