0

我希望我的 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 一次性访问它。

4

1 回答 1

0

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

  • 签署对 S3 的请求
  • 使用提供的 API 和临时凭证

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

  • 签署对 S3 的请求
  • 使用提供的 API 和临时凭证

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

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

于 2021-08-24T16:32:55.410 回答