首页 > 解决方案 > 访问为 API Gateway 执行角色定义的 IAM 角色中的 Cognito 用户 ID 变量?

问题描述

随着最近发布的 API Gateway Cognito Custom Authorizers,我尝试将 Cognito、API Gateway 和 S3 一起用于在没有 Lambdas的情况下进行身份验证的访问控制。

使用 API Gateway 授权可以正常工作(正确设置 API Gateway 执行角色的信任关系),但我似乎无法获取资源策略来捕获 Cognito 用户 ID 子变量,以便基于 S3 资源进行细粒度访问控制用户身份。

这是我正在尝试完成的当前流程:

  1. 使用 Cognito 进行身份验证并获取有效令牌
  2. 将令牌发送到 API Gateway 以获得对 S3 存储桶的访问权限(通过 AWS 服务集成类型)
  3. 仅对用户 ID 的目录进行精细访问
  4. 返回 S3 对象(基于 API 端点)

这是我当前针对 API Gateway 执行角色的资源策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cognito-idp:*",
                "cognito-sync:*",
                "cognito-identity:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/${cognito-identity.amazonaws.com:sub}/*"
            ]
        }
    ]
}

一切正常,但这个 IAM 变量(在附加到 API Gateway 执行角色的策略中)似乎不正确。

我遇到了这篇StackOverflow 文章并尝试使用这两种格式us-east-1:xxxx-xxxx-xxxx-xxxxxxxx-xxxx-xxxx-xxxx但似乎都不起作用。我正在使用sub在 Cognito 用户池用户信息中找到的属性。如果我将 S3 中的文件夹硬编码为 Cognito 用户 ID Sub,它就可以正常工作。

如何让 Cognito 变量在 API Gateway 的执行角色策略中工作?

以下是我在 AWS 论坛上发现的与该问题相关的其他几篇文章:

Cognito IAM 变量不适用于假定角色策略

我们可以将哪些认知信息用作 IAM 变量?

标签: amazon-web-servicesamazon-s3aws-api-gatewayamazon-cognito

解决方案


这不是变量所期望的子。无法在策略中使用 cognito 用户池属性。您想要的 sub 是 cognito identity id,它是 cognito Identity(联合身份池)中用户的 id。您可以使用 get id 方法获取此 ID。我建议您将此 ID 作为自定义属性变量存储在您的 cognito 用户池中,这样您就不必继续拨打电话。您可以在此处阅读有关此身份 ID的更多信息。


推荐阅读