2016-09-06 4 views
2

У меня есть шлюз API AWS, который я бы хотел защитить с помощью IAM Roles.Доступ к шлюзу API AWS с ролями IAM из Python

Я ищу пакет, который поможет мне получить доступ к нему с помощью Python. Я пытаюсь избежать реализации всего Version 4 Signing Process. Я уверен, что я должен использовать некоторую библиотеку.

Я просмотрел aws-requests-auth, но для создания подписи требуется «aws_service». Я также посмотрел на boto3, но я не могу найти способ просто добавить заголовки аутентификации в общий запрос.

ответ

9

Вы можете использовать aws-requests-auth для генерации подписи для вашего запроса к API Gateway с execute-api в качестве имени службы.

import requests 
from aws_requests_auth.aws_auth import AWSRequestsAuth 

auth = AWSRequestsAuth(aws_access_key='YOURKEY', 
         aws_secret_access_key='YOURSECRET', 
         aws_host='restapiid.execute-api.us-east-1.amazonaws.com', 
         aws_region='us-east-1', 
         aws_service='execute-api') 

headers = {'params': 'ABC'} 
response = requests.get('https://restapiid.execute-api.us-east-1.amazonaws.com/stage/resource_path', 
         auth=auth, headers=headers) 
+0

Спасибо, работает как очарование. После установки пользовательских имен доменов я заменил aws_host и получаю URL с моим собственным доменным именем. – blueCat

1

Просто построить на ответ Ка Hou Ieong «s, есть одна вещь, которая споткнулась меня. Я использовал aws-requests-auth==0.3.0, а при использовании requests.get(url, auth=auth) я все еще получал 403.

; TLDR;: Мой URL был строки запроса и это выглядит как aws-requests-auth не или, вероятно, не может убедиться, что QueryString параметры отсортированы в порядке возрастания и % закодирована.

==> Поэтому, как только я изменил мой url QueryString заказываются и % закодирована, я получил 200.

Детали: Я включил API протоколирования шлюза, и я получаю

In [46]: resp = requests.get(url, auth=auth) 

In [47]: resp.text 
Out[47]: u'{"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.... 

(новые линии и усечения (...) выше шахтные)

Пер с Amazon Canonical Request for Signature Version 4,

Чтобы построить каноническую строку запроса, выполните следующие шаги:

Сортируйте имена параметров по коду символа в порядке возрастания. Например, имя параметра, начинающееся с прописной буквы F, предшествует имени параметра, которое начинается с буквы нижнего регистра b.

URI-кодирование для каждого имени параметра и значения в соответствии со следующими правилами:

а. Не кодируйте URI любого из безоговорочных символов, которые RFC 3986 определяет: A-Z, a-z, 0-9, дефис (-), подчеркивание (_), период (.) И тильда (~).

b. Процент-кодировать все остальные символы с% XY, где X и Y - шестнадцатеричные символы (0-9 и верхний регистр A-F).Например, символ пробела должен быть закодирован как% 20 (не используя «+», как это делают некоторые схемы кодирования), а расширенные символы UTF-8 должны быть в форме% XY% ZA% BC.

Это каноническое QueryString используется в генерации Authorization Signature и АМС применяет те же правила при расчете Signature Version 4 сиговых. Подводя итог, я думаю, конечно aws-requests-authAuth, конечно, не может изменить ваш url, вам нужно.