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

mip*_*pnw 6 amazon-web-services amazon-cognito

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

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

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

此外,我不希望我需要的 API 需要指定角色名称。Cognito 身份池已配置为向经过身份验证的用户提供特定角色。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}
    }
});
Run Code Online (Sandbox Code Playgroud)

mip*_*pnw 7

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

1-人们需要一个id_tokennot 来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
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要AssumeRoleWithIdentity,或者GetCredentialsWithIdentity,您甚至不需要AmazonCognitoIdentityClient.