使用多个用户池的具有 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 网关的主要内容,如果未能解决你的问题,请参考以下文章