Где я ошибаюсь в процессе подписи API запросов Amazon DynamoDB

Я использую продукт под названием Alteryx, и я пытаюсь написать макрос Alteryx, который использует API запросов Dynamodb, чтобы я мог получить доступ к своим таблицам Dynamodb из Alteryx. К сожалению, мне не разрешено использовать один из Amazon SDK, поэтому мне приходится кодировать подпись API запросов Amazon вручную / в Alteryx.

Я использую пример Python Post, который включен в документацию Amazon, чтобы помочь мне в этом процессе. Пример Python можно найти здесь: Пример сообщения Python.

Я выполнил каждую из задач, изложенных в примере:

  1. Определить переменные запроса
  2. Создать канонический запрос
  3. Создайте строку для подписи
  4. Рассчитать подпись
  5. Добавьте информацию для подписи в запрос и сделайте запрос.

Первоначально я получал следующую ошибку:

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"}

Итак, затем я сравнил свой канонический запрос с тем, который указан в сообщении об ошибке. Вот что я нашел:

  1. Запрос был идентичен за одним исключением. Канонический запрос, представленный в сообщении об ошибке, имел заголовок content-type:, но исключал соответствующее значение типа содержимого.
  2. Мой канонический запрос включал как заголовок типа содержимого, так и значение.
  3. Хэш параметров запроса в конце канонического запроса идеально совпал со всем остальным.

Это важно, потому что канонический запрос - это вход для следующего шага процесса. Вы должны вычислить хэш-дайджест sha256 канонического запроса, чтобы создать строку для подписи. Я пробовал два альтернативных подхода / обходных пути для этой проблемы:

  1. Сначала я использовал полученный мной канонический запрос (включая значение типа содержимого), чтобы вычислить строку для подписи. В этом случае все соответствовало сообщениям об ошибках String To Sign, за исключением последнего элемента: хэша канонического запроса.
  2. Мой следующий подход заключался в вычислении канонического запроса, который исключал значение типа содержимого и, следовательно, точно соответствовал каноническому запросу, включенному в сообщение об ошибке. В этом сценарии производная строка для подписи полностью совпала, за исключением хэша канонического запроса.

ВОПРОС 2: сталкивался ли кто-нибудь с этой ошибкой; знаете ли вы причину и / или у вас есть обходной путь.

Я надеюсь, что как только я смогу ответить на вопрос 3, я смогу успешно выполнить 4-ю задачу, вычислить подпись и успешно сделать запрос api.

ВОПРОС 3. Знает ли кто-нибудь о других проблемах в этом процессе, есть ли у него какие-либо дополнительные предложения или идеи.


person Mutuelinvestor    schedule 04.07.2015    source источник
comment
Вы знакомы с UTC? Вот что означает Z в метке времени. Не по местному времени. Вы отправляете с запросом действительный и разумный заголовок Content-Type:?   -  person Michael - sqlbot    schedule 05.07.2015
comment
Это для понимания UTC. 4-часовые настройки работают хорошо. Это то, что я использую для своего типа контента: application / x-amz-json-1.0   -  person Mutuelinvestor    schedule 05.07.2015
comment
поэтому для подписания время должно быть UTC. также проверьте, что часы в вашей системе установлены правильно (при необходимости обновите через ntp)   -  person Mircea    schedule 07.07.2015


Ответы (1)


Если у вас нет особых причин делать это вручную, стандартный совет - использовать boto для доступа к AWS из Python. .

РЕДАКТИРОВАТЬ: В целом стандартный совет - использовать доступные библиотеки там, где они подходят для вашего варианта использования.

РЕДАКТИРОВАТЬ 2: См. Комментарии к sys.path и обходным путям для вашего случая.

person Ming    schedule 04.07.2015
comment
Понятно, к сожалению, эта опция мне недоступна в данном случае. - person Mutuelinvestor; 04.07.2015
comment
Если вы не возражаете, я спрашиваю, почему? Какие конкретные ограничения у вас есть в вашем текущем сценарии использования? - person Ming; 04.07.2015
comment
Я использую программное обеспечение для хранения данных под названием Alteryx, и я пытаюсь написать соединитель Dynamodb для Alteryx. В результате мне пришлось разработать соединитель с помощью макросов Alteryx. - person Mutuelinvestor; 04.07.2015
comment
Я не знаком с этим конкретным продуктом. Есть ли способ подключить к PYTHONPATH внешние библиотеки? В качестве альтернативы, есть ли способ вручную включить библиотеки в исходный дистрибутив напрямую? (Обычно это плохая идея, но я считаю ее предпочтительнее повторной реализации некоторых существующих библиотек вручную.) - person Ming; 04.07.2015
comment
то есть я бы предпочел вручную отбросить содержимое пакета boto в свой проект, чем повторно реализовать функциональность внутри. - person Ming; 04.07.2015
comment
как бы получить внешние библиотеки на PythonPath ?. Alteryx предоставляет командную строку, которую можно использовать в макросах. - person Mutuelinvestor; 04.07.2015
comment
У Alteryx есть инструмент команды запуска, описанный здесь downloads.alteryx.com/Alteryx8. 6.2 / WebHelp / runcommand.htm. Разрешит ли это использовать PythonPath? - person Mutuelinvestor; 04.07.2015
comment
Интересно. Если я правильно это понимаю, вы можете дать ему произвольную команду для выполнения? Если это так, это немного открывает ваши возможности. Я вижу как минимум два возможных варианта. - person Ming; 05.07.2015
comment
Вариант 1: вызовите сценарий загрузчика в Python, который устанавливает sys.path в соответствии с документами. python.org/2/library/sys.html#sys.path перед передачей управления вашему фактическому скрипту. - person Ming; 05.07.2015
comment
Вариант 2: вызовите сценарий cmd / Powershell, который устанавливает PYTHONPATH env var согласно docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH перед вызовом Python. - person Ming; 05.07.2015
comment
Вариант 3: Я считаю, что есть способ напрямую передать дополнительные sys.path элементы через флаги в python исполняемый файл, но в данный момент я не могу его найти. - person Ming; 05.07.2015