问题描述
在我的应用中,用户可以将图像上传到他们在 S3 存储桶中的文件夹。当前与从 S3 上传和检索图像相关的请求通过 API 网关处理,用户通过 Cognito 进行身份验证。
有没有一种方法可以列出存储桶文件夹中的所有对象并能够显示所有图像?
我问的问题与 this one 相同,但我只希望经过身份验证的用户能够访问它。
有没有办法通过 Lambda 函数检索它们?
感谢任何帮助。
更新
我尝试实现 S3 的 listObjectsV2
函数,该函数不返回每个对象的已签名 URL。有没有办法做到这一点?
来自函数的响应:
{
"IsTruncated": false,"Contents": [
{
"Key": "username/image/Screenshot 2021-02-22 at 13.24.55.png","LastModified": "2021-03-07T19:43:05.000Z","ETag","Size": 22436,"StorageClass": "STANDARD"
}
],"Name": "user-images","Prefix": "username/","MaxKeys": 1000,"CommonPrefixes": [],"KeyCount": 1
}
解决方法
推荐的提供私有内容的方法是:
- 不要使用存储桶策略
- 将所有对象保持为私有
- 用户对您的应用进行身份验证
- 当用户请求访问私有对象,或者您希望在页面上包含私有对象(例如在
<img src="...">
标签中)时,应用程序应检查用户是否被允许 访问对象 - 如果他们被允许访问对象,应用程序会生成一个 Amazon S3 pre-signed URLs,它提供对私有对象的限时访问
- 当用户的浏览器将预签名 URL 发送到 S3 时,Amazon S3 将检查 URL 是否正确以及时间段是否未过期。如果没问题,它会返回私有对象
通过这种方式,您的应用程序管理与访问相关的所有权限,但内容本身由 Amazon S3 提供。这允许复杂的访问逻辑,例如用户与其他用户共享照片。