我有一个使用Nuxt的Amplify App。当用户通过Cognito登录时,该应用会尝试使用STS转移到另一个角色,以在Fisher-yates之后获得一个QuickSight仪表板嵌入网址。
因此,我在这项政策中扮演了角色:
20/08/11 21:24:01 - INFO - __main__ - Going the latin route
20/08/11 21:24:01 - INFO - __main__ - data read to pandas DF.
20/08/11 21:24:01 - INFO - __main__ - df shape: (0, 6)
并且我将此政策添加到了我的app-authenticated-role
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "quicksight:GetDashboardEmbedUrl",
"Resource": "arn:aws:quicksight:us-west-2:xxxxxxxx:dashboard/xxxx-xxxx-xxxxx-xxxx-xxxxxxxxxxxxx",
"Effect": "Allow"
}
]
}
当他们通过Cognito登录时,我尝试使用STS来假设embed_role
具有:
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::xxxxxxxxx:role/embed_role_name"
}
}
我收到此错误:
AccessDenied:用户:arn:aws:sts :: xxxxxxxxxx:assumed-role / app-authenticated-role / CognitoIdentityCredentials未经授权执行:sts:AssumeRole在资源上:arn:aws:iam :: xxxxxxxxxxxxx:role / embed_role
在文档中似乎很简单,所以我不确定我是否只是不了解某些内容。
另外,在尝试一百万次尝试的过程中,我认为我为app-authenticated-role和embed-role编辑了Trust Relationships,并且不确定这是一种方式还是另一种方式。
应用程序身份验证角色信任策略为:
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);
}
});
和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"
}
}
}
]
}
答案 0 :(得分:1)
未获得授权的原因是因为我需要使用操作
"Action": "sts:AssumeRole"
在我的应用身份验证角色信任策略而不是
"Action": "sts:AssumeRoleWithWebIdentity"
一旦更换,它就会按预期工作。
答案 1 :(得分:0)
如果您使用Cognito身份池将经过身份验证的用户映射到IAM角色,则通常不使用sts:AssumeRole
来获取Web身份的IAM凭据,而不是直接调用AWS.CognitoIdentityCredentials()
。
这将在后台进行2个呼叫。首先,它使用给定的登录名(来自身份提供者(例如Cognito用户池,Facebook,Google等)的JWT令牌)来创建新的身份或检索现有的身份。其次,它将代表您调用sts:AssumeRoleWithWebIdentity
并返回IAM凭据。
这一切都在Cognito Identity Pool docs中进行了描述。
因此,您通过身份验证的角色信任策略将是:
{
"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身份可以调用STS来代表网络身份获取凭据。
与该角色关联的权限策略为:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "quicksight:GetDashboardEmbedUrl",
"Resource": "arn:aws:quicksight:us-west-2:xxxxxxxx:dashboard/xxxx-xxxx-xxxxx-xxxx-xxxxxxxxxxxxx",
"Effect": "Allow"
}
]
}
加上您的网络用户应具有的其他权限。