2016-09-06 118 views
2

我有一个AWS API网关,我想使用IAM Roles来确保安全。使用Python API中的IAM角色访问AWS API网关

我正在寻找一个软件包来帮助我使用Python访问它。我试图避免执行整个Version 4 Signing Process。我确定必须有一些我可以使用的图书馆。

我看着aws-requests-auth,但它需要一个“aws_service”来生成签名。我也看到boto3,但我无法找到任何方法只是添加身份验证标头的一般要求。

回答

9

您可以使用aws-requests-auth为您的API网关请求生成签名,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

只是建立在嘉侯杨允的反应,有其绊倒了我一两件事。我正在使用aws-requests-auth==0.3.0,并在使用requests.get(url, auth=auth)我仍然得到403

; TLDR;:我URL查询字符串,它看起来像aws-requests-auth没有或很可能不能确保查询字符串参数升序排列% -encoded。

==>所以一旦我改变,责令我url查询字符串和% -encoded,我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.... 

(新线和截断(...)以上是我的)

亚马逊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的格式。

规范查询字符串在生成Authorization Signature使用,AWS计算Signature Version 4 SIG当应用相同的规则。 底线,我想当然aws-requests-authAuth当然不能改变你的url,你必须。

相关问题