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

How to get AWSCredentials given a AWS Cognito access_token

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

我应该用 access_token 调用什么 API 来获得 AWSCredentials 对象。

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

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

我查看了 Cognito Identity Pool API Reference,但找不到需要 access_token 和 return 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}
    }
});

要获取凭据,您可以在 AWS Android SDK 中使用 GetCredentialsForIdentity method by passing the JWT token. This method is implemented in AmazonCognitoIdentityClient class。

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

经过大量调查,我找到了答案。

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