我有一个使用Nuxt的Amplify应用程序。当用户通过cognito登录时,应用程序会尝试使用STS转移到另一个角色,以在这篇AWS博客文章之后获得QuickLight Dashboard嵌入Url。
因此,我在这项政策中扮演了一个角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "quicksight:GetDashboardEmbedUrl",
"Resource": "arn:aws:quicksight:us-west-2:xxxxxxxx:dashboard/xxxx-xxxx-xxxxx-xxxx-xxxxxxxxxxxxx",
"Effect": "Allow"
}
]
}
我将此策略添加到我的应用程序身份验证角色中
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::xxxxxxxxx:role/embed_role_name"
}
}
当他们通过cognito登录时,我试图假设使用STS 的embed_role
带有:
let params = {
RoleArn: QS_EMBED_ROLE,
RoleSessionName: "embedding-qs",
};
let sts = new AWS.STS();
sts.assumeRole(params, function (err, data) {
if (err) console.log(err, err.stack);
// an error occurred
else {
console.log(data);
}
});
我得到这个错误:
AccessDenied:用户:arn:aws:sts::xxxxxxxxxx:假定角色/应用程序身份验证的角色/CognitoIdentityCredentials未被授权在资源上执行:sts:AssumeRole:ams::xxxxxxxx:role/embed_role
它在文档中看起来很直接,所以我不确定我是否只是不理解一些东西。
此外,在尝试了一百万件事情的过程中,我认为我编辑了应用程序身份验证角色和嵌入角色的信任关系,不确定这是否重要。
应用程序身份验证的角色信任策略为:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-2:xxxxxxxx-xxxxxx-xxxxxx-xxxx-xxxxxxxx"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
}
]
}
embed_ ole信任策略为:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-2:xxxxxxxx-xxxxxx-xxxxxx-xxxx-xxxxxxxx"
}
}
}
]
}
这没有被授权的原因是因为我需要使用操作
"Action": "sts:AssumeRole"
在我的应用程序验证角色信任策略而不是的策略中
"Action": "sts:AssumeRoleWithWebIdentity"
一旦被替换,它就如预期的那样工作。
如果您使用Cognito身份池将经过身份验证的用户映射到IAM角色,则通常不会直接调用sts:AssumeRole
,而是使用AWS.CognitoIdentityCredentials()
获取web身份的IAM凭据。
这在幕后打了两个电话。首先,它使用给定的登录(来自身份提供商(如Cognito用户池、Facebook、谷歌等(的JWT令牌(来创建新身份或检索现有身份。其次,它将代表您致电sts:AssumeRoleWithWebIdentity
并返回IAM凭据。
这一切都在Cognito Identity Pool文档中进行了描述。
因此,您的身份验证角色信任策略是:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-2:xxxxxxxx-xxxxxx-xxxxxx-xxxx-xxxxxxxx"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
}
]
}
其声明Cognito Identity可以调用STS来获得代表web身份的凭证。
与该角色相关联的权限策略为:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "quicksight:GetDashboardEmbedUrl",
"Resource": "arn:aws:quicksight:us-west-2:xxxxxxxx:dashboard/xxxx-xxxx-xxxxx-xxxx-xxxxxxxxxxxxx",
"Effect": "Allow"
}
]
}
再加上你的网络用户应该拥有的任何其他权限。