在最近发布的API网关Cognito自定义授权程序中,我试图将Cognito,API Gateway和S3一起用于没有Lambda的经过身份验证的访问控制 。
使用API Gateway授权可以正常工作(正确设置了API Gateway执行角色的信任关系),但是我似乎无法获得资源策略来捕获Cognito用户ID子变量,以便对S3进行精细访问控制基于用户ID的资源。
这是我要完成的当前流程:
这是我当前针对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-xxxx
和xxxx-xxxx-xxxx-xxxx
这两种格式,但似乎都没有用。我正在使用Cognito用户池用户信息中的sub
属性。如果我将S3中的文件夹硬编码为Cognito User ID Sub,它就可以正常工作。
如何使Cognito变量在API网关的执行角色策略中起作用?
我在AWS论坛上发现了与该问题有关的其他几篇文章:
答案 0 :(得分:0)
那不是变量期望的子。在策略中无法使用认知用户池属性。您想要的子项是Cognito身份ID,它是Cognito身份(联合身份池)中用户的ID。您可以使用get id方法获取此ID。我建议您将此ID作为自定义属性变量存储在您的cognito用户池中,这样就不必继续进行调用。 您可以阅读有关此身份ID here的更多信息。