为API网关执行角色定义的IAM角色中的Access Cognito用户ID变量?

时间:2019-02-20 21:51:30

标签: amazon-web-services amazon-s3 aws-api-gateway amazon-cognito

在最近发布的API网关Cognito自定义授权程序中,我试图将Cognito,API Gateway和S3一起用于没有Lambda的经过身份验证的访问控制

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

这是我要完成的当前流程:

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

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

{
    "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网关执行角色附带的策略中)似乎不正确。

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

如何使Cognito变量在API网关的执行角色策略中起作用?

我在AWS论坛上发现了与该问题有关的其他几篇文章:

Cognito IAM variables not working for assumed-role policies

What cognito information can we use as IAM Variables?

1 个答案:

答案 0 :(得分:0)

那不是变量期望的子。在策略中无法使用认知用户池属性。您想要的子项是Cognito身份ID,它是Cognito身份(联合身份池)中用户的ID。您可以使用get id方法获取此ID。我建议您将此ID作为自定义属性变量存储在您的cognito用户池中,这样就不必继续进行调用。 您可以阅读有关此身份ID here的更多信息。