首页 文章

使用Python中的IAM角色访问AWS API Gateway

提问于
浏览
5

我有一个AWS API网关,我想使用IAM Roles来保护 .

我正在寻找一个包来帮助我使用Python访问它 . 我试图避免实现整个Version 4 Signing Process . 我相信必须有一些我可以使用的库 .

我查看aws-requests-auth但它需要"aws_service"才能生成签名 . 我也看了boto3,但我无法找到任何方法只是将身份验证标头添加到一般请求 .

2 回答

  • 1

    您可以使用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)
    
  • 13

    仅仅以Ka Hou Ieong的回应为基础,还有另外一件事让我感到沮丧 . 我正在使用 aws-requests-auth==0.3.0 ,在使用 requests.get(url, auth=auth) 时我仍然得到一个 403 .

    ;TLDR; :我的URL有一个查询字符串,它看起来像 aws-requests-auth 没有或者可能无法确保查询字符串参数是 sorted in ascending order% -encoded .

    ==> 所以,一旦我将 url 查询字符串更改为已订购且 % -encoded,我得到了 200 .

    Details :我打开了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编码:不要对RFC 3986定义的任何非保留字符进行URI编码:A-Z,a-z,0-9,连字符( - ),下划线(_),句点( . )和波浪号(〜) . 湾使用%XY对所有其他字符进行百分比编码,其中X和Y是十六进制字符(0-9和大写A-F) . 例如,空格字符必须编码为%20(不使用'',如某些编码方案那样),扩展的UTF-8字符必须采用%XY%ZA%BC的形式 .

    该规范查询字符串用于生成 Authorization Signature ,AWS在计算 Signature Version 4 sig时应用相同的规则 . 底线,我想当然 aws-requests-auth Auth 当然不能改变你的 url ,你必须 .

相关问题