使用Cognito的Amplify Flutter下载S3文件时出现403 Access Denied错误
解决步骤
- 校验下载请求的访问级别配置
受保护存储内容对应的访问级别为StorageAccessLevel.protected,未显式指定时Amplify默认使用private级别会触发403错误,正确的请求示例如下:try { final downloadResult = await Amplify.Storage.downloadFile( key: "目标文件的S3键名", localFile: File("本地存储路径"), options: const StorageDownloadFileOptions( accessLevel: StorageAccessLevel.protected, // 跨用户访问其他用户上传的受保护内容时需额外指定 // targetIdentityId: "文件上传者的Cognito身份ID" ), ).result; } on StorageException catch (e) { print("下载失败:${e.message}"); } - 修正权限授予对象
你当前配置的IAM用户权限不生效:Amplify Storage默认通过Cognito身份池关联的IAM角色(分为认证用户角色、未认证用户角色两类)请求S3资源,权限需要绑定到对应Cognito角色而非独立IAM用户。
对应角色需要添加的S3权限示例如下,需替换为你自己的存储桶名:
如果存储桶开启了KMS服务端加密,还需要额外给对应角色添加{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::你的存储桶名称/protected/*"] } ] }kms:Decrypt权限。 - 校验S3存储桶配置
检查存储桶策略是否存在显式拒绝Cognito角色访问的规则,确认存储桶的公共访问配置没有拦截合法的身份池请求。 - 同步配置并清除过期凭证
执行amplify push将本地的Amplify配置同步到云端,登出当前账号并清除应用缓存后重新登录测试,排除本地缓存的过期身份凭证导致的鉴权失败。
内容的提问来源于stack exchange,提问作者Sirajudheen Abdul Rahiman
相关产品推荐
相关产品推荐

