Oauth 2.0 这是否可能使用cognito';s授权码授权类型作为api网关中的授权人?

Oauth 2.0 这是否可能使用cognito';s授权码授权类型作为api网关中的授权人?,oauth-2.0,aws-api-gateway,amazon-cognito,websecurity,rest-security,Oauth 2.0,Aws Api Gateway,Amazon Cognito,Websecurity,Rest Security,我想知道,在保护API网关的安全中,是否有任何方法或可能性将授权码授予类型作为Authroizer实现?正如搜索到的,最建议使用“授权码”授权类型来保护API。 我在下面找到一篇文章,解释了如何使用cognito“客户端凭据”作为授权类型来保护api网关 我尝试了类似的方法来创建API网关,在这里我完成了以下集成: 在cognito中创建了用户池“UI Hosted”,授予类型为“Authorization code” 添加资源服务器 已选择默认范围,因为我不想添加任何新范围 关联回拨u

我想知道,在保护API网关的安全中,是否有任何方法或可能性将授权码授予类型作为Authroizer实现?正如搜索到的,最建议使用“授权码”授权类型来保护API。 我在下面找到一篇文章,解释了如何使用cognito“客户端凭据”作为授权类型来保护api网关

我尝试了类似的方法来创建API网关,在这里我完成了以下集成:

  • 在cognito中创建了用户池“UI Hosted”,授予类型为“Authorization code”

  • 添加资源服务器

  • 已选择默认范围,因为我不想添加任何新范围

  • 关联回拨uri

  • 现在我可以访问登录页面进行注册和登录,并在回拨uri中返回“授权码”

    在API网关中
  • 我创建了一个API并集成了一些模拟响应

  • 作为api网关中的授权人附加在用户池上方并已部署

  • 现在,当我在不传递令牌的情况下调用api时,它返回“Unauthorized”

    所以我使用下面的方法从cognito中提取访问令牌

    并使用post man在api头中传递了令牌,但仍然收到“未经授权”的响应

    因此,您想知道需要在api网关中执行哪些操作才能验证令牌,或者这种方法中出现了哪些错误

    如果有人能帮上忙,我会很感激的


    谢谢

    您的API的角色只是处理来自API客户端的传入访问令牌。API不关心使用什么流来获取令牌。以下是迄今为止最常见的行为:

    • UI使用授权代码流(通常是PKCE变体)登录用户
    • 这涉及到调用授权服务器的UI—例如AWS Cognito
    • 登录完成后,UI使用访问令牌/JWT调用API网关URL
    • 然后,API需要通过验证其签名来验证访问令牌
    以下是一些示例代码,以防有所帮助:

    AWSAPI网关内置了对Cognito授权者的支持,如下面左侧的屏幕截图所示。


    为了更好地控制行为,您可以在代码中创建一个自定义lambda授权程序,它返回一个AWS策略文档,如右侧的屏幕截图所示。我的和上面的源代码链接有一些进一步的细节,尽管它非常详细/高级。

    最后我在这里得到了答案

    因此,我在这里创建了一个简单的flask逻辑来交换auth代码,以从cognito获取“id_令牌”,它还可以传入api头以获取响应

    def getToken(auth_code):
        response=''
        try:
            print("Code is", auth_code)
            response = requests.post(url + '/oauth2/token',{'Content-Type':'application/x-www-form-urlencoded', 'grant_type': grant_type, 'client_id': App_client_id,  'code': auth_code, 'redirect_uri': 'http://localhost:5000/login'})
            if response.status_code != 200:
                return "Not a valid response"
            print("Response is", response.json())
            token_value = response.json()
            print("Token value", token_value['id_token'])
            return token_value['id_token']
    
        except TypeError as e:
            print("Error is",e)
    

    您好@Gary,我刚刚用我厌倦了使用授权代码作为授权类型的用例更新了我的问题。但是它没有预期的效果很酷-看起来你正在进步。也许作为下一步,看看内置的Cognito授权器是否适合您——我已经在上面添加了一些细节。