如何允许经过 Cognito 身份验证的用户获得 public 对 s3 存储桶的访问权限

how to allow cognito authenticated users to get public access to s3 bucket

我希望我的 Cognito 身份验证用户(通过 google 身份提供商)访问存储桶对象 publically 而无需任何 x-Amz-Security 或签名令牌。

在我的应用中,经过身份验证的用户每天上传 100 张图片,我无法在 Dynamodb 中使用令牌 URL 存储每张图片,因为它的有效期只有 7 天,7 天后其令牌会发生变化. 访问存储桶对象的另一种方法是请求 getObject 调用,它需要一个键(文件名)和 returns object/image URL 以及一个令牌(和到期时间),我可以使用它来呈现一张图片,但我不想额外调用来获取标记化 URL。 因此,我希望经过身份验证的用户能够 public 访问我存储桶中的所有对象。

为此,我正在使用 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 存储桶访问 image/object。 我也试过这个原理,但是它允许 public 访问对象,这意味着未经身份验证的用户也可以访问它。

{
                "AWS": "*"
            },

在此之后,我在我的 Cognito 池 ID 和 google id 的帮助下创建了一个身份池。并授予其读、写和列表权限。但是经过身份验证的用户仍然需要签名的 URL,我想让他们一次访问它,使用未签名的 URL.

如果我对你的问题的理解正确,要访问你不想访问的非public S3 对象:

  • 将请求签名到 S3
  • 使用提供的 API 和临时凭证

这里的问题是要访问 S3 中的受限对象,您必须使用两种可能的机制之一:

  • 将请求签名到 S3
  • 使用提供的 API 和临时凭证

您需要以某种方式告诉 S3 谁在请求该文件。在您的情况下,它是联合用户。您可以通过使用从 STS 获得的安全令牌对请求进行签名或使用 SDK 将 ID 令牌交换为一组临时凭证然后对 S3 进行签名调用来告诉它 API.

如果我对你的理解正确的话——你不想做这两件事中的任何一件。在那种情况下,你就不走运了。您将无法按照您想要的方式实现您想要的。