这是不是可以使用 cognito 的授权代码授权类型作为 api-gateway 中的授权人?

Posted

技术标签:

【中文标题】这是不是可以使用 cognito 的授权代码授权类型作为 api-gateway 中的授权人?【英文标题】:Is this possible to use cognito's Authorization code grant type as a authorizer in the api-gateway?这是否可以使用 cognito 的授权代码授权类型作为 api-gateway 中的授权人? 【发布时间】:2020-09-23 16:38:39 【问题描述】:

我想知道在保护 API 网关时是否有任何方法或可能性将授权代码授予类型实现为授权器?正如所搜索的那样,“授权码”授权类型最推荐用于保护 API。 我发现下面的文章解释了使用 cognito 'client credentials' 作为授权类型来保护 api 网关,

https://medium.com/@awskarthik82/part-1-securing-aws-api-gateway-using-aws-cognito-oauth2-scopes-410e7fb4a4c0

我尝试了类似的方法来创建一个 API 网关,我已经完成了以下集成:

    在 cognito 中创建用户池“UI Hosted”,授权类型 - “授权码”

    添加资源服务器

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

    关联的回调 uri

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

在 API 网关中

    我创建了一个 API 并集成了一些模拟响应

    在api网关中作为Authorizer附加上面的用户池并部署

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

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

How programtically exchange the authorization code to get the access token from cognito using python

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

所以想知道在 api 网关中需要做什么才能验证令牌或这种方法出了什么问题..?

是否有人可以提供帮助?

谢谢

【问题讨论】:

【参考方案1】:

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

UI 使用授权码流记录用户 - 通常是 PKCE 变体 这涉及调用授权服务器的 UI - 例如 AWS Cognito 登录完成后,UI 会使用访问令牌/JWT 调用 API Gateway URL API 然后需要通过验证其签名来验证访问令牌

以下是一些示例代码,以防有帮助:

Lambda Authorizer Code to Verify Cognito Tokens Web UI Code to implement Authorization Code Flow

AWS API Gateway 已内置对 Cognito 授权方的支持,如左下角的屏幕截图所示。

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

【讨论】:

嗨@Gary,我刚刚用我厌倦了使用授权代码作为授权类型的用例更新了我的问题。但它没有按预期工作 酷 - 看起来你正在进步。也许下一步看看内置的 Cognito 授权器是否适合你——我在上面添加了一些细节。【参考方案2】:

我终于在这里得到了答案..

https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-user-pool-oauth-2-0-grants/

所以我在这里创建了一个简单的烧瓶逻辑来交换身份验证代码以从 cognito 获取“id_token”,它可以进一步传入 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)

【讨论】:

以上是关于这是不是可以使用 cognito 的授权代码授权类型作为 api-gateway 中的授权人?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Lambda 授权方的 AWS Cognito 和 API 网关

Cognito 授权人组

如何从 AWS cognito 授权代码获取访问和刷新令牌

如何利用 AWS Cognito 托管 UI 进行授权代码授予流程

使用 AWS Amplify 和 AWS Cognito 进行数据特定授权

具有 Cognito 联合身份的 AWS AppSync IAM 授权