使用多个用户池的具有 Cognito 授权的 AWS API 网关

Posted

技术标签:

【中文标题】使用多个用户池的具有 Cognito 授权的 AWS API 网关【英文标题】:AWS API Gateway with Cognito Authorization using multiple user pools 【发布时间】:2020-11-27 16:44:08 【问题描述】:

我有多个 Cognito 用户池,用于将不同应用程序的用户分开。我还有一组在 API Gateway 中定义的 API。这些 API 很常见,多个应用程序可以使用它们。我正在尝试使用 Cognito 资源服务器和自定义范围来控制哪些应用程序可以访问哪些 API。

这是我一直关注的指南:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-enable-cognito-user-pool.html

我遇到的问题是我必须在创建 API Gateway 授权方时指定用户池。我可以创建多个授权者,但在将授权者附加到 API 网关方法时,我似乎只能选择一个。

此设置意味着在使用 Cognito 授权方时,只有一个用户池可以访问 API Gateway 中的 API。这是正确的还是我错过了什么?

我唯一的选择似乎是使用 Lambda 授权者并手动完成所有这些操作。但是,这意味着我必须存储 API 端点/方法和自定义范围之间的映射。如果我采用这种方法,我将如何验证访问令牌是否可以访问传入请求中的端点?

【问题讨论】:

【参考方案1】:

我做过类似的事情,但不完全是你正在做的事情,但也许它会引导你朝着正确的方向前进。

所以我认为你是对的,你需要做一个 Lambda 授权方,然后承担认知用户的角色。然后,如果该用户无权执行某项操作,IAM 就会将其炸毁。

client = boto3.client('sts')
role=event['requestContext']['authorizer']['claims']['cognito:preferred_role']

assumed_role_object = client.assume_role(
    RoleArn=role,
    RoleSessionName='APIrole'
)
credentials=assumed_role_object['Credentials']
dynamo_resource=boto3.resource(
    'dynamodb',
    aws_access_key_id=credentials['AccessKeyId'],
    aws_secret_access_key=credentials['SecretAccessKey'],
    aws_session_token=credentials['SessionToken'],
)

【讨论】:

【参考方案2】:

这里发布了一个解决方案: How to use multiple Cognito user pools for a single endpoint with AWS API Gateway?

我发现 Abhay Nayak 的回答很有用,它帮助我实现了我的场景:

允许使用不同 Cognitos 提供的 JWT 从不同的 aws 帐户对单个端点进行授权。使用 cognito 用户池授权器,而不是自定义 lambda 授权器。

这是我的无服务器 .yml 模板中的授权方和端点:

functions:
  service:
    handler: service.service
    events:
      - http:
          path: service
          method: get
          authorizer:
            type: COGNITO_USER_POOLS
            authorizerId:
              Ref: ApiGatewayAuthorizer


resources:
  Resources:
    ApiGatewayAuthorizer:
      Type: AWS::ApiGateway::Authorizer
      Properties:
        AuthorizerResultTtlInSeconds: 300
        Name: API_AUTH_cognito_authorizer
        IdentitySource: method.request.header.Authorization
        RestApiId:
          Ref: ApiGatewayRestApi
        Type: COGNITO_USER_POOLS
        ProviderARNs:
          - arn:aws:cognito-idp:us-east-1:account1:userpool/userpool1
          - arn:aws:cognito-idp:us-east-1:account1:userpool/userpool2
          - arn:aws:cognito-idp:us-east-1:account2:userpool/userpool3
          - arn:aws:cognito-idp:us-east-1:account2:userpool/userpool4

【讨论】:

以上是关于使用多个用户池的具有 Cognito 授权的 AWS API 网关的主要内容,如果未能解决你的问题,请参考以下文章

具有 Cognito 用户池授权方的 AWS SAM API

链接到 Cognito 用户池的 AWS Amplify GraphQL 架构

如何在 API 网关中通过混合 Cognito 身份和用户池来授权 API

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

具有授权的 AWS Cognito 用户(如何从应用程序将用户添加到用户组?)

具有多个应用程序的 Cognito 一个用户池