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

如何让已登录Cognito用户使用身份池认证角色访问AWS资源?

问题分析与解决方案

问题核心

你当前的代码仅初始化了CognitoAWSCredentials,但未将**已登录用户的认证信息(如ID Token或Cognito身份ID)**关联到凭证对象,导致AWS SDK默认尝试使用未认证角色,这就是权限错误的根源。

解决步骤

1. 登录后获取用户的认证令牌

用户完成Cognito登录后,从CognitoUserSession中提取ID Token:

// 假设已完成用户登录,拿到CognitoUserSession对象
String idToken = cognitoUserSession.getIdToken().getJWTToken();

2. 正确初始化CognitoAWSCredentials并关联认证用户

不要使用默认构造方法,通过传入用户认证令牌,让SDK明确使用认证角色:

// 创建身份提供者映射,指定Cognito用户池作为认证源
Map<String, String> logins = new HashMap<>();
logins.put("cognito-idp.eu-west-1.amazonaws.com/你的用户池ID", idToken);

// 初始化凭证,传入登录信息
CognitoAWSCredentials identityPoolCreds = new CognitoAWSCredentials(
    accountID,
    identityPoolID,
    logins, // 关键:传入已登录用户的认证信息
    null, // 未认证角色设为null,因为不需要
    Regions.EU_WEST_1
);

3. 禁用身份池的未认证访问

在AWS控制台的身份池设置中,找到「未认证身份」选项,直接禁用该功能,彻底杜绝未认证访问的可能。

4. 验证认证角色的权限策略

确保认证角色已配置正确的S3和DynamoDB访问权限,示例策略如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::你的存储桶名称",
                "arn:aws:s3:::你的存储桶名称/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Query"
            ],
            "Resource": "arn:aws:dynamodb:eu-west-1:你的账号ID:table/你的表名"
        }
    ]
}

关键说明

  • 只有将已登录用户的认证令牌传入CognitoAWSCredentials的logins参数,SDK才会向身份池请求认证角色的临时凭证,否则默认走未认证流程。
  • 禁用未认证访问后若仍出现相关错误,需排查所有使用Cognito凭证的代码,确保均关联了用户认证信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:15:37