如何在AWS Cognito access_token的情况下获取AWSCredentials

时间:2018-04-08 20:15:23

标签: amazon-web-services amazon-cognito aws-cognito

在Android应用中,一旦用户完成对Cognito用户池的身份验证,我就会从http://<domain>.auth.<region>.amazoncognito.com/login收到JWT access_token。该用户池链接到Cognito Identity Pool。

我应该使用access_token调用哪个API来获取AWSCredentials对象。

我找到的最接近的是AssumeRoleWithWebIdentity,但这是一个STS API,我在网上看到的一些内容似乎建议开发人员不要直接使用STS,而是依赖Cognito。

此外,我不希望我需要API来指定角色名称。 Cognito Identity Pools已配置为向经过身份验证的用户提供特定角色。并且AssumeRoleWithWebIdentity将角色名称作为API的输入。因此,这看起来不正确。

我查看了Cognito Identity Pool API Reference,找不到采用access_token并返回AWS凭据的API。

更新 以下答案使用GetCredentialsForIdentity抛出ResourceNotFoundException,说它无法找到指定的IdentityId。

string access_token = ...
var jwtAccessToken = System.IdentityModel.Tokens.Jwt.JwtSecurityToken(access_token);

var client = new AmazonCognitoIdentityClient(new AnonymousAWSCredentials(),REGION);

var response = await client.GetCredentialsForIdentityAsync(new GetCredentialsForIdentityRequest
{
    IdentityId=String.Format("{0}:{1}", REGION, jwtAccessToken.id),
    Logins=new Dictionary<string,string> 
    { 
        {String.Format("cognito-idp.{0}.amazonaws.com/{1}", REGION, USER_POOL_ID),
         access_token}
    }
});

2 个答案:

答案 0 :(得分:1)

经过多次调查,我找到了答案。

1-一个人需要id_token而不是access_token来对Cognito进行身份验证,因为这听起来有误导性。 AWS的文档说明当您需要拥有名称/电子邮件等用户属性时要求id_token ...并且当您不需要该信息并且只是想要进行身份验证时请求access_token是错误的,或者至少是误导性的。

2-以下是使用id-token获取AWS凭证的方法:

var credentials = CognitoAWSCredentials(<identity pool Id>, region);
credentials.AddLogin(
    "cognito-idp.<region>.amazonaws.com/<user_pool_id>",
    id_token); // the raw token

请注意,您不需要AssumeRoleWithIdentityGetCredentialsWithIdentity,甚至不需要AmazonCognitoIdentityClient

答案 1 :(得分:0)

要获取凭据,您可以通过传递JWT令牌来使用GetCredentialsForIdentity方法。此方法在AWS Android SDK中的AmazonCognitoIdentityClient类中实现。

IAM角色应在Cognito联合身份中定义。这限制了内部处理的假定角色,Cognito不允许移动应用承担除配置之外的任何其他角色。此外,您不应该赋予此角色IAM权限,允许Android SDK承担不同的角色(除非是超级用户类型的用户登录)。