3

我有一个简单的用例来使用 AWS Cognito 对用户进行身份验证,并假设一个角色能够做一些有用的事情(在我的例子中从 S3 读取)。显然我错过了一些非常明显的东西。

我正在使用带有 cognito 身份验证的纯 Web http 客户端(因此 Cognito 可以联合其他身份提供者)并且后端仅接收 id_token。

我可以使用 获取会话凭据getCredentialsForIdentity,显然此凭据已从 Cognito 身份池定义的角色分配了权限(在我的情况下为 Cognito_demoidpoolAuth_Role)

我的想法是创建联合网络身份可以承担的另一个角色。

所以我为 Web Identity 创建了一个新角色,访问数据的角色具有以下策略的信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "eu-central-1:500a5721-abca-xxxx-xxxx-c15625a7xxxx"
        }
      }
    }
  ]
}

以下代码应承担从存储桶中读取所需的角色

WebIdentityFederationSessionCredentialsProvider credProvider = new WebIdentityFederationSessionCredentialsProvider(
   idToken,
   null,
    "arn:aws:iam::535544306598:role/docmgr-test-role" );

在引擎盖下这个对象调用assumeRoleWithWebIdentity,我得到以下异常:

com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException: 
Not authorized to perform sts:AssumeRoleWithWebIdentity (Service: AWSSecurityTokenService;
 Status Code: 403; Error Code: AccessDenied; Request ID: 059e56ee-25c8-11e8-8852-f7ca4d49742b)

使用 id_token 直接调用 STS assumeRoleWithWebIdentity 以相同的结果结束,因此显然我设置了错误的策略或试图以错误的方式做事。

4

0 回答 0