繁体   English   中英

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

[英]how to allow cognito authenticated users to get public access to s3 bucket

我希望我的 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 和谷歌 ID 的帮助下创建了一个身份池。 并授予其读、写和列表权限。 但是仍然经过身份验证的用户仍然需要一个签名的 URL,我想让他们使用一个 go 和一个未签名的 URL 来访问它。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM