0

目前我正在开发无服务器架构,其中 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 网关中使用访问令牌?我的理解是访问令牌(在授权标头中)比复杂的签名签名过程更容易使用。

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

4

2 回答 2

0

这会有所帮助吗?

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

然后将用户添加到组中。

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

于 2018-11-20T09:21:08.947 回答
0

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

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

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

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

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

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

于 2019-08-14T05:17:03.877 回答