簡體   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