【发布时间】: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