簡體   English   中英

無需訪問密鑰的 AWS S3 JavaScript 瀏覽器上傳

[英]AWS S3 JavaScript browser upload without access key

我想將文件上傳到 S3,最好不要通過后端服務器,而只能通過瀏覽器。

在 AWS 示例中,要創建 S3 客戶端,我需要提供密鑰和密鑰 ID:

const S3 = new AWS.S3({
    accessKeyId: <ACCESS_KEY_ID>,
    secretAccessKey: <ACCESS_KEY_SECRET>,
    region: <AWS_REGION>
});

但我不想公開我的訪問密鑰。 該網站托管在 CloudFront 中,是否可以在 CloudFront 和 S3 存儲桶之間設置權限,以便我不需要在 JavaScript 中提供憑據?

出於安全原因,您通常應該有一些方法來審核上傳到 S3 的對象的來源(如果您允許公共訪問,它畢竟可以是任何東西)。

與其允許完全公開訪問,不如設置AWS Cognito並在您的前端使用它。

您可以選擇以下場景之一:

  • 用戶通過 cognito 用戶登錄
  • 使用匿名用戶。

這兩個選項都將生成您的前端可以使用的臨時憑證。 這將防止用戶記下它們並永遠保留它們,確保您鎖定權限,使其僅成為該特定 S3 存儲桶的 putObject。

另一種方法是使用 API Gateway 和 Lambda 生成可以支持上傳的預簽名 URL。 有關此方法的更多信息,請查看本文

為了增強您的安全性,可能值得添加一個S3 事件來觸發一個 Lambda,該 Lambda 將在對象上傳后對其進行驗證。

您需要某種后端才能有效地隱藏您的憑據。 由於您已經在 AWS 世界中,您可以使用 AWS Lambda 函數將所謂的預簽名上傳 url 返回到您的前端,您可以使用它來上傳二進制文件。

更多信息: AWS S3 預簽名 URL

您需要使用 S3 預簽名 URL。 您的后端會生成一個包含簽名的特殊 URL 並將其發送到瀏覽器。 然后瀏覽器可以使用該 URL 發送 POST 請求(或 PUT 請求,但這是一個簽名的 PUT URL)以將文件直接上傳到 S3 存儲桶。 沒有訪問密鑰暴露給客戶端。

您仍然需要向后端添加訪問密鑰,如果它在 AWS 內部,則可以通過角色添加訪問密鑰。 但是這些密鑰不會到達瀏覽器,只會到達簽名。

我已經寫了很多關於這個主題的文章,還制作了一些代碼示例,您可以查看。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM