我試圖生成預簽名的URL,然後通過瀏覽器將文件上傳到S3。我的服務器端代碼如下所示,並生成以下URL:使用簽名URL上傳到S3時獲取403(禁止)
let s3 = new aws.S3({
// for dev purposes
accessKeyId: 'MY-ACCESS-KEY-ID',
secretAccessKey: 'MY-SECRET-ACCESS-KEY'
});
let params = {
Bucket: 'reqlist-user-storage',
Key: req.body.fileName,
Expires: 60,
ContentType: req.body.fileType,
ACL: 'public-read'
};
s3.getSignedUrl('putObject', params, (err, url) => {
if (err) return console.log(err);
res.json({ url: url });
});
這部分似乎正常工作。如果我登錄它並將它傳遞到前端,我可以看到該URL。然後在前端,我試圖用axios和簽名的URL上傳文件:
.then(res => {
var options = { headers: { 'Content-Type': fileType } };
return axios.put(res.data.url, fileFromFileInput, options);
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
});
}
這樣,我得到了403 Forbidden錯誤。如果我按照鏈接,有一些XML更多信息:
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
...etc
謝謝,這不是,但我覺得我對問題的感覺更好。我很確定有些東西不匹配,我只是沒有弄清楚究竟是什麼。 – Alan
雖然這應該是其中的一部分。這是一個非常確定性的過程,對不一致的容忍度爲零。根據您實際發送的請求,錯誤消息中的CanonicalRequest將間接地告訴您應該將哪些參數傳遞給getSignedUrl()。 –
謝謝,終於找到了正確的標題,並取得了成功的放入請求。 – Alan