在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}
}
});
答案 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
请注意,您不需要AssumeRoleWithIdentity
或GetCredentialsWithIdentity
,甚至不需要AmazonCognitoIdentityClient
。
答案 1 :(得分:0)
要获取凭据,您可以通过传递JWT令牌来使用GetCredentialsForIdentity方法。此方法在AWS Android SDK中的AmazonCognitoIdentityClient类中实现。
IAM角色应在Cognito联合身份中定义。这限制了内部处理的假定角色,Cognito不允许移动应用承担除配置之外的任何其他角色。此外,您不应该赋予此角色IAM权限,允许Android SDK承担不同的角色(除非是超级用户类型的用户登录)。