具有Cognito授权的AWS API Gateway

时间:2018-11-20 05:37:04

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

当前,我正在开发无服务器架构,其中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 /移动设备/邮递员工具)必须生成签名并放入Authorization标头中。是否有其他方法可以控制用户池组中的授权,但可以在api网关中使用访问令牌?我的理解是,访问令牌(位于Authorization标头中)比复杂的签名过程更容易使用。

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

2 个答案:

答案 0 :(得分:0)

该帮助代替吗?

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

然后将用户添加到组中。

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

答案 1 :(得分:0)

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

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

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

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

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

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