【问题标题】:AWS API Gateway with cognito authorization具有认知授权的 AWS API 网关
【发布时间】:2019-04-22 12:48:17
【问题描述】:

目前我正在开发无服务器架构,其中 AWS API 网关中有一组资源和方法。我计划将 Cognito 身份验证(用户池)和授权作为安全层添加到 AWS API 网关。

AWS API Gateway 中有 3 个授权方,即 IAM、Cognito 用户池和自定义 lambda。

对于我的用例,登录和注册(身份验证)通过 API 网关使用 cognito 用户池。这是完美的作品。我的用户将提供应用程序客户端 ID 和客户端密码以启用这两个进程。登录后,我的意图是让用户能够使用访问令牌(由用户池返回)通过 api 网关访问资源。

但是,我的用户可以具有不同的角色,例如管理员、所有者或访客。用户只能访问授权的 api。我的方法是将用户放入用户池中的不同组,将 IAM 策略分配给组并启用身份池。这迫使我将 api 网关中的授权类型更改为 IAM。和 IAM 要求每个请求都由 Signature V4 签名。

这意味着每个请求都必须通过会话令牌、访问密钥、秘密(在与联合池交换 id 令牌后返回)进行注册,而不是使用基于访问令牌的方法。因此,在我的用例中,在我的用户通过 api 网关登录后,我的客户端应用程序(web/mobile/postman 工具)必须生成签名并放入 Authorization 标头。是否有替代方法来控制用户池组中的授权,但在 api 网关中使用访问令牌?我的理解是访问令牌(在授权标头中)比复杂的签名过程更容易使用。

如果我错了,请纠正我。谢谢。

【问题讨论】:

    标签: aws-api-gateway amazon-cognito federated-identity aws-userpools


    【解决方案1】:

    这会有所帮助吗?

    在用户池中创建并将 IAM 角色分配给组

    然后将用户添加到组中。

    更多文档在这里:https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-user-groups.html

    【讨论】:

      【解决方案2】:

      您在正确的轨道上,但您选择了在 AWS 上授权用户请求的路径之一。您正在使用 IAM 和身份池,因此,您必须使用 AWS 提供的 Signature V4 对每个请求进行签名。

      根据我的经验,我建议不要选择自定义 Lambda 授权方而不是身份池。在这种情况下,您的身份验证将保持您已经构建的状态。但是,您可以创建一个 lambda 函数,而不是在 API 网关中应用 IAM 作为授权方,该函数将接收用户想要在请求中授权的 API 网关的 ARN,以及您在从用户池进行身份验证期间收到的用户 ID_TOKEN

      {
        ...
        "cognito:roles": [
          "arn:aws:iam::**********:role/addBookSellerRole"
        ],
        "exp": 1565758916,
        "iat": 1565755316,
        ...
      }
      

      您可以看到您将从身份验证收到的 JWT 中的 ID_TOKEN 中获取角色数组。您可以使用此角色获取附加到此角色的策略。按照此document 获取角色的策略。

      获得策略 JSON 后,您可以将其与请求中收到的方法的 ARN 与策略列表进行比较。这样,您必须生成允许或拒绝请求的策略文档。

      要了解更多信息,请访问我的中型博客Authorization using Cognito + API Gateway + IAM

      【讨论】:

      • 你能发布一个上面提到的流程的例子吗?
      • @TayyabSarwar 在这里写所有步骤是不可能的,因为这都是关于aws 中的配置,但你仍然需要我的帮助,让我知道。
      • 感谢您的回复。您能否发布自定义 Lambda 授权方代码以验证角色和令牌?真的会很治愈。
      猜你喜欢
      • 2021-06-23
      • 2018-05-17
      • 1970-01-01
      • 2020-02-24
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      相关资源
      最近更新 更多