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

基于Cognito认证的Amplify应用如何通过URL访问私有S3对象?

如何通过URL访问已登录(Cognito认证)后的私有S3对象

核心解决方案是使用预签名URL(Presigned URLs)——这是给私有S3对象生成的临时可访问链接,自带有效期,只有持有链接的人在有效期内能访问,完全不用把存储桶设为公开,符合AWS的安全建议。

结合你的Amplify+Cognito场景,具体操作如下:

1. 通过Amplify生成预签名URL

因为你的应用已经依赖Amplify,直接用它的Storage模块就能生成预签名URL,不用自己写复杂的签名逻辑,而且会自动集成Cognito的认证信息,确保只有登录用户能生成有效链接。

安卓端代码示例:

// 确保已导入Amplify Storage依赖
val getUrlOptions = GetUrlOptions.builder()
    .withExpiration(3600) // 设置链接有效期,单位秒,这里设1小时,可按需调整
    .build()

Amplify.Storage.getUrl(
    "你的S3对象键", // 替换成你要访问的文件在S3里的对象键
    getUrlOptions,
    { result ->
        val presignedUrl = result.url.toString()
        // 拿到URL后,直接用安卓的媒体加载库(比如Glide、Coil)加载
        // 示例:Glide.with(this).load(presignedUrl).into(imageView)
    },
    { error -> Log.e("S3", "生成预签名URL失败", error) }
)

2. 配置必要的权限

要确保两个权限配置正确:

  • S3存储桶策略:允许已认证的Cognito用户执行s3:GetObject操作,示例策略片段:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:cognito-identity:你的AWS区域:你的账号ID:identitypool/你的身份池ID"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::你的存储桶名/*"
            }
        ]
    }
    
  • Cognito身份池角色:已认证用户的角色需要包含S3读取权限,Amplify初始化时通常会自动配置这部分,若没配置,手动给角色添加s3:GetObject的权限即可。

3. 用安卓媒体库加载URL

拿到预签名URL后,直接用Glide、Coil这类安卓媒体加载库发起HTTP请求就行,它们的多线程处理、缓存机制比Amplify自带的下载方式更高效,正好解决你遇到的下载慢问题。


预签名URL的使用流程(对应你提供的图示翻译)

  1. 用户通过Cognito完成认证后,向应用(或直接通过Amplify)请求目标S3对象的预签名URL
  2. 应用/Amplify携带用户的认证凭证,向AWS S3服务申请生成预签名URL
  3. S3返回带有临时访问权限的预签名URL给应用
  4. 应用拿到URL后,通过安卓媒体库发起HTTP请求,直接获取S3对象内容

内容的提问来源于stack exchange,提问作者coderror

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:25:22