javascript - 使用签名 URL 上传到 S3 时获取 403(禁止访问)

标签 javascript node.js amazon-web-services amazon-s3 axios

我正在尝试生成预签名 URL,然后通过浏览器将文件上传到 S3。我的服务器端代码如下所示,它生成 URL:

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

最佳答案

您的请求需要与签名完全匹配。一个明显的问题是您实际上并没有在请求中包含标准 ACL,即使您在签名中包含了它。更改为:

var options = { headers: { 'Content-Type': fileType, 'x-amz-acl': 'public-read' } };

关于javascript - 使用签名 URL 上传到 S3 时获取 403(禁止访问),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46869962/

相关文章:

python - AWS EB 客户端不支持的区域设置

javascript - 如何使用javascript从字符串中获取值

javascript - 将参数从 Stack-navigator 传递到选项卡导航器 (react-navigator 5)

node.js - 如何使用socket.io发送图片、音频、视频流?

node.js - 未处理的拒绝 promise 异步等待链

node.js - 即时将文件从 S3 移动到 AWS EFS

amazon-web-services - 使用 CI/CD 的 AWS Amplify Hosting 与使用 S3/Cloudfront 的手册

javascript - Bing "Address Object"缺少 adminDistrict 或 postalCode

javascript - 查找嵌套的 <li> 并修改它

node.js - `fs.mkdir` 正在创建与指定权限不同的目录