AWS:尝试加载预签名的URL时访问被拒绝(直接文件上传浏览器)

时间:2019-04-24 06:37:21

标签: javascript node.js amazon-s3 file-upload

我正在尝试使用一个预签名的URL,但是尽管设置了我认为应该的所有设置,但我仍然得到403 Forbidden Access Denied。我想直接从浏览器将文件上传到Amazon S3。

首先,我要启用AWS根帐户使用putObject。我没有任何其他帐户-我只希望它可以用作我的根帐户。这是存储桶策略:

{
    "Version": "2012-10-17",
    "Id": "XXXX",
    "Statement": [
        {
            "Sid": "XXXXX",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXX:root"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::XXXXX/*"
        }
    ]
}

这是我的Node.js后端。在这里,我只是生成url并将其发送到前端。后端的一些代码:

const aws = require('aws-sdk');

aws.config.update({
  region: "eu-north-1",
  accessKeyId: "XXX",
  secretAccessKey: "YYY"
});

const s3 = new aws.S3({ apiVersion: "2006-03-01" });

app.get('/geturl', (req,res) => {

   const s3Params = {
      Bucket: 'XXXXXXXXXXXXX',
      Key: req.query.filename,
      Expires: 500,
      ContentType: req.query.type,
      ACL: "public-read"
   };

   s3.getSignedUrl("putObject", s3Params, (err, data) => {
      res.send(data);
   });

})

在前端,我使用要上传的文件的URL进行了简单的呼叫。当我执行第二次访存调用时,它将生成错误:

async function handleUpload(e) {
     const file = e.target.files[0];

     const res = await fetch('http://localhost:3001/geturl');

     const url  = await res.text();

     const resUpload = await fetch(url, { method: 'PUT', body: file });


}

有什么想法我做错了吗?

编辑-如果我取消选中第一个复选框,它似乎可以正常工作-这有什么大不了?还是应该在生产环境中始终将其阻止?

1 个答案:

答案 0 :(得分:0)

在您的后端中,尝试将ACL: "public-read"更改为ACL: "private"。然后,您应该能够阻止所有公共访问,并且仍然能够成功完成预定的放置权/职务。