如何通过AWS Amplify iOS SDK允许访客从S3存储桶下载文件
403错误代表S3资源访问请求被权限规则拒绝,你本地执行amplify configure创建的用户权限,和iOS应用端访问S3时使用的权限完全独立,二者没有关联。以下是常见的遗漏配置:
- Cognito身份池关联角色未配置S3访问权限
Amplify Storage默认通过Cognito身份池关联的IAM角色来获取S3访问权限,你需要根据业务场景,给身份池对应的**已认证用户角色(Auth Role)或未认证用户角色(Unauth Role)**绑定s3:GetObject相关权限策略,比如AmazonS3ReadOnlyAccess,或者自定义包含对应桶资源访问权限的策略。 - 存储桶策略限制了角色访问
检查Amplify创建的S3存储桶的桶策略,确认是否允许对应Cognito角色对目标资源执行GetObject操作。默认Amplify生成的桶策略会限制仅允许身份池角色访问桶内public/、protected/、private/三类前缀下的资源,如果你手动修改过桶策略,或者上传的文件不在上述前缀路径下,都会触发403错误。 - 下载时访问级别与文件存储级别不匹配
Amplify Storage默认将文件分为三类访问级别:public、protected、private,不同级别对应存储桶内不同的前缀路径。如果你存储文件时用的是非public级别,下载时需要显式指定访问级别,示例代码如下:
operation = Amplify.Storage.downloadFile( key: key, local: url, // 非public级别需要显式指定 options: .init(accessLevel: .private) ) { [weak self] progress in guard let _ = self else { return } print("progress: \(progress.fractionCompleted)") } resultListener: { [weak self] result in guard let _ = self else { return } // 结果处理逻辑 }
- 用户登录状态不匹配
如果你只给已认证用户角色开放了S3权限,但应用端当前没有已登录的Cognito用户,会默认使用未认证角色访问资源,就会触发403。需要先完成用户登录流程,再执行下载操作。 - 目标文件访问控制列表(ACL)配置错误
如果你是手动通过S3控制台上传的目标文件,而非通过Amplify Storage接口上传,文件默认的ACL可能不允许Cognito角色访问。你可以修改文件ACL,给对应角色开放读权限,或者如果是公开访问的资源,直接设置为公共可读。 - 项目配置文件不匹配
检查iOS项目内的amplifyconfiguration.json文件,确认其中Storage模块配置的bucket名、region、Cognito身份池ID与你AWS账号下的实际资源一致,配置错误也会导致签名验证失败返回403。
内容的提问来源于stack exchange,提问作者Danny Bravo
相关产品推荐
相关产品推荐

