簡體   English   中英

AWS S3-從getSignedUrl()輸入URL會返回403 SignatureDoesNotMatch錯誤

[英]AWS S3 - PUT to URL from getSignedUrl() returns 403 SignatureDoesNotMatch error

這個問題使我發瘋了兩天了。

目標:通過AWS Javascript SDK中的getSignedUrl函數提供的預簽名URL,將圖像直接從瀏覽器直接上傳到S3。

我用getSignedUrl生成URL沒有任何問題。 以下代碼...

const params = {
  Key:         key,
  Bucket:      process.env.S3_BUCKET,
  ContentType: "image/jpeg"
};

S3.getSignedUrl("putObject", params, callback);

...產生如下內容:

https://s3.amazonaws.com/foobar-bucket/someImage.jpeg?AWSAccessKeyId=ACCESSKEY123&Content-Type=image%2Fjpeg&Expires=1543357053&Signature=3fgjyj7gpJiQvbIGhqWXSY40JUU%3D&x-amz-acl=private&x-amz-security-token=FQoGZXIvYXdzEDYaDPzeqKMbfgetCcZBaCL0AWftL%2BIT%2BP3tqTDVtNU1G8eC9sjl9unhwknrYvnEcrztfR9%2FO9AGD6VDiDDKfTQ9SmQpfXmiyTKDwAcevTwxeRnj6hGwnHgvzFVBzoslrB8MxrxjUpiI7NQW3oRMunbLskZ4LgvQYs8Rh%2FDjat4H%2F%2BvfPxDSQUSa41%2BFKcoySUHGh2xqfBFGCkHlIqVgk1KELDHmTaNckkvc9B4cgEXmAd3u1f1KC9mbobYcLLRPIzMj9bLJH%2BIlINylzubao1pCQ7m%2BWdX5xAZDhTSNwQfo4ywSWV7kUpbq2dgEriOiKAReEjmFQtuGqYBi3t2dhrasptOlXFXUozdz23wU%3D

但是通過PUT請求將圖像上傳到提供的URL始終會從S3返回403 SignatureDoesNotMatch錯誤。

起作用的是:

  • 從AWS Lambda的本地實例調用getSignedUrl()(通過serverless-offline)。

什么不起作用:

  • 將查詢字符串變量設置為標題(Content-Type,x-amz- *等)
  • 刪除所有標題
  • 在獲取URL時更改ACL(私有,公共讀寫,無ACL等)
  • 在Node中更改aws-sdk的區域
  • 嘗試POST而不是PUT(值得一試)

在這個問題上的任何幫助將不勝感激。 如果這仍然是一個問題,我將把我的計算機扔出窗戶,然后沮喪地跳出來,因為它根本不想工作!

我想到了。 調用getSignedUrl()的Lambda函數沒有正確的IAM角色權限來訪問有問題的S3存儲桶。 在serverless.yml中...

iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:*
      Resource: "arn:aws:s3:::foobar-bucket/*"

我實際上不會在這里使用通配符,但是您會看到圖片。 即使由於缺少權限而注定URL失敗,getSignedUrl() 仍然可以成功並返回URL的事實極具誤導性。

我希望這個答案將來能幫助一些困惑的人。

它以舊的方式為我工作:(axios一直給403 Forbidden)

  const xhr = new XMLHttpRequest();
  xhr.open("PUT", signedRequest);
  xhr.onreadystatechange = () => {

    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        //Put your logic here..
         //When it get's here you can access the image using the url you got when signed.
      }    
    }
  };
  xhr.send(file);

請注意,這需要從客戶端運行,因此您需要在存儲桶中配置Cross Origin Police。

在此處輸入圖片說明

暫無
暫無

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

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