我有一个简单的用例来使用 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 以相同的结果结束,因此显然我设置了错误的策略或试图以错误的方式做事。