如何让已登录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
相关产品推荐
相关产品推荐

