Amplify集成手动创建的Cognito与S3时,已登录用户无法通过Auth_Role访问S3文件的问题咨询
这种情况我之前也踩过坑,核心问题大概率是已认证用户没有正确关联到你配置了S3权限的Auth_Role,或者角色的信任/权限配置存在漏洞。下面是一步步的排查方向:
1. 确认Amplify配置是否指向你的手动创建角色
Amplify默认会用它自动生成的Auth/Unauth角色,但你用了手动创建的实例,必须在Amplify配置里明确指定角色ARN:
Amplify.configure({ Auth: { identityPoolId: '你的Cognito身份池ID', region: '你的区域', userPoolId: '你的用户池ID', userPoolWebClientId: '你的用户池客户端ID', roleArn: '你的Auth_Role的ARN', // 关键:指定已认证用户的角色 unauthRoleArn: '你的Unauth_Role的ARN' }, Storage: { bucket: '你的外部S3桶名', region: '你的区域', identityPoolId: '你的Cognito身份池ID' } });
如果没设置roleArn,Amplify可能会用身份池默认生成的角色,而不是你配置了权限的那个。
2. 检查Cognito身份池的角色映射
去Cognito控制台的身份池页面,进入**“身份验证提供程序”** -> “Cognito”,确认已认证身份的角色是你配置了S3权限的Auth_Role:
- 确保“已验证角色”下拉框选中的是你的目标Auth_Role
- 不要勾选“使用默认角色”(除非你确认默认角色就是你配置的那个)
很多时候手动创建身份池时,这里会默认生成新角色,导致已认证用户拿不到正确的权限。
3. 验证Auth_Role的信任关系是否正确
Auth_Role必须允许Cognito身份池的已认证用户 assume 这个角色,信任策略要包含以下内容(替换你的身份池ID):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }
如果信任关系里没有authenticated的amr条件,或者aud字段不对,已认证用户无法获取该角色的临时凭证,自然会 fallback 到匿名角色,这时候Unauth_Role有权限就会生效。
4. 确认用户确实处于已认证状态
在代码里加个调试日志,确认用户登录后Amplify识别为已认证:
import { Auth } from 'aws-amplify'; async function checkUserStatus() { try { const user = await Auth.currentAuthenticatedUser(); console.log('已认证用户:', user.username); const credentials = await Auth.currentCredentials(); console.log('当前身份ID:', credentials.identityId); // 可以通过这个identityId去Cognito身份池查询对应的角色 } catch (err) { console.log('用户未认证:', err); } }
如果打印结果显示用户未认证,那Amplify会自动使用Unauth_Role,这时候Unauth_Role有权限就可以访问S3。
5. 排查S3桶策略的冲突
虽然你给Auth_Role加了权限,但如果S3桶的策略明确拒绝了该角色的访问,权限会被覆盖。检查桶策略是否有类似如下的拒绝语句:
{ "Effect": "Deny", "Principal": "*", "Action": ["s3:PutObject", "s3:GetObject"], "Resource": "arn:aws:s3:::your-bucket/*", "Condition": { "StringNotEquals": { "aws:PrincipalArn": "你的Unauth_Role的ARN" } } }
这种情况下Auth_Role会被拒绝,而Unauth_Role可以正常访问。确保桶策略没有限制Auth_Role的必要操作,或者明确允许Auth_Role的访问。
总结
按照上面的顺序排查,最常见的问题是身份池角色映射错误或者Auth_Role信任关系配置不当。只要确保已认证用户能正确获取到配置了S3权限的Auth_Role,问题就能解决。
内容的提问来源于stack exchange,提问作者THpubs

