我正在尝试使用一个预签名的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 });
}
有什么想法我做错了吗?
编辑-如果我取消选中第一个复选框,它似乎可以正常工作-这有什么大不了?还是应该在生产环境中始终将其阻止?
答案 0 :(得分:0)
在您的后端中,尝试将ACL: "public-read"
更改为ACL: "private"
。然后,您应该能够阻止所有公共访问,并且仍然能够成功完成预定的放置权/职务。