You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:22:19