4

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

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

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

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

  2. 添加资源服务器

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

  4. 关联的回调 uri

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

在 API 网关中

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

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

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

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

如何使用 python 以编程方式交换授权代码以从 cognito 获取访问令牌

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

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

感谢是否有人可以提供帮助?

谢谢

4

2 回答 2

2

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

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

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

AWS API Gateway 内置了对 Cognito 授权方的支持,如左下角的屏幕截图所示。 在此处输入图像描述

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

于 2020-06-04T19:21:48.587 回答
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)
于 2020-06-10T11:27:42.163 回答