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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:09:08