![](/img/trans.png)
[英]SignatureDoesNotMatch error when performing get request on URL from AWS S3 getSignedUrl in Node.js
[英]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-sdk
的區域 在這個問題上的任何幫助將不勝感激。 如果這仍然是一個問題,我將把我的計算機扔出窗戶,然后沮喪地跳出來,因為它根本不想工作!
我想到了。 調用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.