如何用Kotlin SDK将Cognito用户池令牌兑换为身份池临时凭证?
解决Cognito用户池令牌兑换身份池临时凭证的问题
先明确几个核心问题
- 你拿到的
idToken是Cognito用户池颁发的,和身份池无关,身份池需要用这个令牌验证用户身份并生成访问AWS服务的临时凭证。 - API不会自动完成兑换流程,需要你手动调用Cognito Identity的两个核心API:
GetId和GetCredentialsForIdentity。
步骤1:补充必要参数
先定义你的身份池ID和用户池ID(替换成自己的实际值):
private val cognitoIdentityPoolId = "eu-north-1:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx" // 你的身份池ID private val cognitoUserPoolId = "eu-north-1_xxxxxxxxx" // 你的用户池ID
步骤2:实现令牌兑换逻辑
在你现有代码的//...And now what?位置添加以下代码:
// 1. 构造登录映射,身份池通过这个映射识别用户池来源的身份 val loginMap = mapOf( "cognito-idp.eu-north-1.amazonaws.com/$cognitoUserPoolId" to idToken ) identityPoolClient.use { identityClient -> try { // 2. 获取唯一的Identity ID val getIdRequest = GetIdRequest { identityPoolId = cognitoIdentityPoolId logins = loginMap } val getIdResult = identityClient.getId(getIdRequest) val identityId = getIdResult.identityId ?: run { _loginState.value = BooleanMessage(message = "无法获取Identity ID", success = false) return@launch } // 3. 兑换临时AWS访问凭证 val getCredsRequest = GetCredentialsForIdentityRequest { this.identityId = identityId this.logins = loginMap } val credsResult = identityClient.getCredentialsForIdentity(getCredsRequest) val credentials = credsResult.credentials ?: run { _loginState.value = BooleanMessage(message = "无法获取AWS临时凭证", success = false) return@launch } // 4. 拿到可用的临时凭证,可用于后续调用AWS服务(如S3、DynamoDB等) val accessKey = credentials.accessKeyId val secretKey = credentials.secretKey val sessionToken = credentials.sessionToken val expirationTime = credentials.expiration _loginState.value = BooleanMessage(message = "登录及凭证兑换成功", success = true) } catch (e: Exception) { _loginState.value = BooleanMessage(message = "凭证兑换失败: ${e.message}", success = false) } }
关键说明
- 登录映射格式:必须严格按照
cognito-idp.{region}.amazonaws.com/{userPoolId}作为key,value为用户池返回的idToken,身份池通过这个key关联对应的用户池身份源。 - 临时凭证有效期:默认1小时,过期后需要重新执行兑换流程。
- 权限配置检查:确保你的身份池已关联目标用户池,且身份池的认证IAM角色配置了访问目标AWS服务的权限。
内容的提问来源于stack exchange,提问作者Primordial_Hamster
相关产品推荐
相关产品推荐

