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

Java中使用STS AssumeRole调用Cognito ListUsers遇令牌无效问题

排查Java STS AssumeRole后调用Cognito ListUsers的令牌无效问题

从几个核心方向逐一排查:

1. 确认临时凭证是否正确注入Cognito客户端

绝大多数情况问题出在这里:你可能执行了AssumeRole获取到临时凭证,但并未用这些凭证初始化Cognito客户端,依然使用了默认的环境/配置文件凭证。

Java里必须用STS返回的Credentials对象构建BasicSessionCredentials,再用它创建Cognito客户端:

// 执行AssumeRole获取临时凭证
AssumeRoleResult assumeRoleResult = stsClient.assumeRole(assumeRoleRequest);
Credentials tempCreds = assumeRoleResult.getCredentials();

// 用临时凭证构建Cognito客户端
AWSCognitoIdentityProvider cognitoClient = AWSCognitoIdentityProviderClientBuilder.standard()
    .withCredentials(new AWSStaticCredentialsProvider(
        new BasicSessionCredentials(
            tempCreds.getAccessKeyId(),
            tempCreds.getSecretAccessKey(),
            tempCreds.getSessionToken()
        )
    ))
    .withRegion(Regions.US_EAST_1) // 必须和你的Cognito用户池区域完全一致
    .build();

2. 检查AssumeRole角色的权限与信任策略

  • 权限策略:确保你扮演的IAM角色拥有cognito-idp:ListUsers权限,资源范围要覆盖你的目标用户池ARN:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "cognito-idp:ListUsers",
            "Resource": "arn:aws:cognito-idp:你的区域:你的账号ID:userpool/你的用户池ID"
        }
    ]
}
  • 信任策略:确保你的源身份(比如本地IAM用户、ECS任务角色)被允许调用该角色的AssumeRole操作:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::你的账号ID:user/你的IAM用户名"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

3. 验证区域一致性

STS客户端的区域不影响,但Cognito客户端的区域必须和用户池所在区域完全匹配。比如用户池在us-west-2,Cognito客户端就不能用us-east-1,否则会直接触发令牌无效错误。

4. 检查临时凭证有效性

打印临时凭证的Expiration时间,确认是否在有效期内(AssumeRole默认最长有效期1小时)。如果已过期,需重新调用AssumeRole获取新凭证。

对比Python代码的核心差异

Python中是直接将临时凭证的三个字段(AccessKeyId、SecretAccessKey、SessionToken)传给Cognito客户端:

sts_client = boto3.client('sts')
response = sts_client.assume_role(RoleArn='...', RoleSessionName='...')
temp_creds = response['Credentials']

cognito_client = boto3.client(
    'cognito-idp',
    aws_access_key_id=temp_creds['AccessKeyId'],
    aws_secret_access_key=temp_creds['SecretAccessKey'],
    aws_session_token=temp_creds['SessionToken'],
    region_name='你的区域'
)

对比你的Java代码,重点检查是否遗漏了SessionToken的传递,或者错误使用了BasicAWSCredentials(不带会话令牌的普通凭证类)而非BasicSessionCredentials。

错误栈关键点解析

你遇到的“请求中包含的安全令牌无效”对应AWS的InvalidClientTokenId错误,常见触发原因:

  • 会话令牌未传递或传递错误
  • 临时凭证已过期
  • Cognito客户端区域与用户池区域不匹配
  • 角色权限不足(权限不足通常返回AccessDenied,但少数场景会伴随令牌验证错误)

内容的提问来源于stack exchange,提问作者BelovedFool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:48:26