AWS Amplify-CognitoIdentityCredentials未经授权执行:资源上的sts:AssumeRole

时间:2020-08-11 21:26:17

标签: amazon-web-services nuxt.js amazon-cognito amazon-iam aws-sts

我有一个使用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"
        }
      }
    }
  ]
}

2 个答案:

答案 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"
        }
    ]
}

加上您的网络用户应具有的其他权限。