如何在给定 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
请注意,您不需要 AssumeRoleWithIdentity
或 GetCredentialsWithIdentity
,您甚至不需要 AmazonCognitoIdentityClient
。
在 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
请注意,您不需要 AssumeRoleWithIdentity
或 GetCredentialsWithIdentity
,您甚至不需要 AmazonCognitoIdentityClient
。