amazon-web-services - 访问为 API Gateway 执行角色定义的 IAM 角色中的 Cognito 用户 ID 变量?
问题描述
随着最近发布的 API Gateway Cognito Custom Authorizers,我尝试将 Cognito、API Gateway 和 S3 一起用于在没有 Lambdas的情况下进行身份验证的访问控制。
使用 API Gateway 授权可以正常工作(正确设置 API Gateway 执行角色的信任关系),但我似乎无法获取资源策略来捕获 Cognito 用户 ID 子变量,以便基于 S3 资源进行细粒度访问控制用户身份。
这是我正在尝试完成的当前流程:
- 使用 Cognito 进行身份验证并获取有效令牌
- 将令牌发送到 API Gateway 以获得对 S3 存储桶的访问权限(通过 AWS 服务集成类型)
- 仅对用户 ID 的目录进行精细访问
- 返回 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-xxxx
,xxxx-xxxx-xxxx-xxxx
但似乎都不起作用。我正在使用sub
在 Cognito 用户池用户信息中找到的属性。如果我将 S3 中的文件夹硬编码为 Cognito 用户 ID Sub,它就可以正常工作。
如何让 Cognito 变量在 API Gateway 的执行角色策略中工作?
以下是我在 AWS 论坛上发现的与该问题相关的其他几篇文章:
解决方案
这不是变量所期望的子。无法在策略中使用 cognito 用户池属性。您想要的 sub 是 cognito identity id,它是 cognito Identity(联合身份池)中用户的 id。您可以使用 get id 方法获取此 ID。我建议您将此 ID 作为自定义属性变量存储在您的 cognito 用户池中,这样您就不必继续拨打电话。您可以在此处阅读有关此身份 ID的更多信息。
推荐阅读
- javascript - 更改 JSON 结构
- generics - 如何描述返回泛型类型的柯里化函数的生命周期?
- python - MongoDB中基于日期字段的计数和聚合
- java - 加载第二个活动的android应用程序与mainactivity.java文件有问题
- node.js - 这是防止通过服务器端多次提交的好方法吗?
- reactjs - Material-UI:我可以从“onMouseUp”更改 SnackBar 的 ClickAwayListener 的 defaultProp mouseEvent
- r - 当我的 aes 函数中未提及 XXX 时,geom_text 返回“找不到对象 XXX”错误
- node.js - Node.js 请求函数在 url 中添加斜杠
- oracle - PL/SQL 报告 - 如何只找到最高值
- auth0 - Auth0 通用登录中的自定义字段