我希望我的 Cognito 身份验证用户(通过谷歌身份提供者)公开访问存储桶对象,而不需要任何x-Amz-Security
签名令牌。
在我的应用程序中,经过身份验证的用户每天上传 100 张图片,我无法在 Dynamodb 中存储带有令牌的每个图片 URL,因为它仅在 7 天内有效,7 天后它的令牌会更改。访问存储桶对象的另一种方法是请求 getObject 调用,它需要一个键(文件名)并返回带有令牌(和到期)的对象/图像 URL,我可以用它来渲染图像,但我不想进行额外调用以获取标记化的 URL。因此,我希望经过身份验证的用户能够公开访问我存储桶中的所有对象。
为此,我正在使用 Amplify,并且可以使用amplify add storage
. 我尝试编写存储桶策略,但它对我不起作用:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": {
"Federated": "accounts.google.com"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<bucketname>-staging"
},
{
"Effect": "Allow",
"Principal": {
"Federated": "accounts.google.com"
},
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::<bucketname>-staging/*"
}
]
}
上述策略不起作用,我仍然需要一个令牌才能从 s3 存储桶访问图像/对象。我也尝试过这个原则,但它允许公共访问对象,这意味着未经身份验证的用户也可以访问它。
{
"AWS": "*"
},
在此之后,我在 Cognito 池 ID 和 google id 的帮助下创建了一个身份池。并授予它读、写和列出权限。但是经过身份验证的用户仍然需要一个签名的 URL,我希望允许他们使用未签名的 URL 一次性访问它。