【问题标题】:AWS: Access Denied when trying to load presigned url (direct fileupload browser)AWS:尝试加载预签名 URL 时拒绝访问(直接文件上传浏览器)
【发布时间】:2019-09-13 09:06:24
【问题描述】:

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

我首先启用根 AWS 账户以使用 putObject。我没有任何额外的帐户 - 我只是希望它能够为我的 root 帐户工作。这是存储桶策略:

{
    "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 进行简单调用。当我执行第二次 fetch 调用时,它会产生错误:

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 });


}

任何想法我做错了什么?

编辑 - 如果我取消选中第一个复选框,它似乎可以工作 - 这是一个大问题还是应该总是在生产环境中被阻止?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 2016-05-23
      • 2015-03-19
      • 2021-12-11
      • 2021-09-07
      • 2018-07-20
      • 1970-01-01
      相关资源
      最近更新 更多