请原谅noob问题。我有一个基本的图像上传脚本,用于将文件发送到我的S3存储桶:
<body>
<input type="file" id="file-chooser" />
<button id="upload-button">Upload to S3</button>
<div id="results"></div>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.1.34.min.js"></script>
<script type="text/javascript">
AWS.config.update({accessKeyId: "XXXXXXXXXXXXXXXXXX", secretAccessKey: "XXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXX"});
var bucket = new AWS.S3({ params: { Bucket: 'XXXXXXXXXX'} });
var fileChooser = document.getElementById('file-chooser');
var button = document.getElementById('upload-button');
var results = document.getElementById('results');
button.addEventListener('click', function () {
var file = fileChooser.files[0];
if (file) {
results.innerHTML = '';
var params = { Key: file.name, ContentType: file.type, Body: file };
bucket.upload(params, function (err, data) {
results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
});
} else {
results.innerHTML = 'Nothing to upload.';
}
}, false);
</script>
</body>
我也设置了CORS:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<ExposeHeader>ETag</ExposeHeader>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
如果我将我的存储桶的权限设置为Everyone或Authenticated Users并在页面代码中包含访问密钥和密钥,则此页面可以正常工作。然而,暴露我的钥匙似乎是一个可怕的想法。并且这不会允许任何拥有访问密钥/密钥对的人上传到我的存储桶中吗?我怎样才能让这更安全?是否像将CORS配置中的AllowedOrigin更改为我的网站的IP一样简单?但是我的代码中仍然有密钥。
我使用带有编码策略和签名的form-POST方法尝试并失败了几天。我可以在没有身份验证(没有策略)的情况下工作,但是当我尝试包含加密策略时,我得到的是SignatureDoesNotMatch错误。另一个解决方案是在没有授权的情况下使用POST方法,并将CORS AllowedOrigin限制为我的网站IP,如上所述。这太简单了吗?
如果我不在这里,请告诉我。我知道AWS有很好的记录,但我觉得我错过了这个难题的关键部分。谢谢!