[英]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並在您的前端使用它。
您可以選擇以下場景之一:
這兩個選項都將生成您的前端可以使用的臨時憑證。 這將防止用戶記下它們並永遠保留它們,確保您鎖定權限,使其僅成為該特定 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.