首页 > 解决方案 > 上传到 S3 存储桶时出现 403 禁止错误

问题描述

我对 AWS 很陌生,但我很确定我的 IAM 用户设置正确……除了我还需要添加其他权限AmazonS3FullAccess吗?这个名字暗示它应该足够了......要么是权限问题,要么是我的代码在某个地方搞砸了。

我试图按照https://devcenter.heroku.com/articles/s3-upload-node上的指南进行操作。任何帮助,将不胜感激。:)

这是我的相关代码:

//server side code
router.get('/sign-s3', (req, res) => {
  const s3 = new aws.S3();
  const { fileName, fileType } = req.query;
  s3.getSignedUrl('putObject', {
      Bucket: S3BUCKET,
      Key: fileName,
      Expires: 60,
      ContentType: fileType,
      ACL: 'public-read'
  }, (err, data) => {
      if (err) {
        console.log(err);
        res.status(500).json(err)
      }
      res.json({
        signedRequest: data,
        url: `https://${S3BUCKET}.s3.amazonaws.com/${fileName}`
    });
  });
});

//client side code
const onChangeHandler = (e) => {
    const file = e.target.files[0];
    axios
        .get(`/api/bucket/sign-s3?fileName=${file.name}&fileType=${file.type}`)
        .then(signedResponse => {
            axios
            .put(signedResponse.data.signedRequest,file, {    
                headers: {
                'Content-Type': 'multipart/form-data'
              }
            })
            .then(response => {
                console.log("upload successful");
                props.addImages([signedResponse.data.url]);
            })
            .catch(error => console.error(error));
        })
        .catch(error => console.error(error));
}

以及我的错误截图: 错误信息

更新:从我的标志路线中删除线路ACL: 'public-read'允许上传通过,但没有人可以访问图像。:P 基于下面的 johns 评论,我认为这是某种标头问题,所以我'x-amz-acl': 'public-read'在客户端的 put 请求中添加了标头,但它仍然给我同样的无效签名问题

标签: amazon-web-servicesrestamazon-s3http-status-code-403

解决方案


我收到与“AmazonS3FullAccess”的 IAM 用户相同的错误。对我有用的是添加这个 CORS 配置

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

推荐阅读