我很担心这个。我试图从客户端直接发送一些数据到S3,而不是让我的网络服务器陷入困境。我正在使用Python
和boto
库来生成签名,并且javascript(希望)将所有内容转换为S3。
我遇到的这个问题是每当我发送请求时,javascript都会给我以下错误:
我们计算的请求签名与您的签名不符 提供。检查您的密钥和签名方法。
我已经验证了(a)我的密钥有效,以及(b)我可以实际从S3上传/下载内容。我通过Python
上传小型测试文件以及使用普通的“curl
来完成此操作。
我的基本设置是:
服务器端非常简单。它只是吐出一个用于上传的网址:
c = boto.connect_s3(settings.S3_ACCESS_KEY, settings.S3_AWS_SECRET_ACCESS_KEY)
c.generate_url(5000, 'PUT', settings.S3_BUCKET, 'mycoolkey')
哪个吐出这样的东西:
https://mytestbucket.s3.amazonaws.com/mycoolkey?Signature=OX6vJCNjb4Pz3Fuzh0840qCnY5U%3D&Expires=1415394562&AWSAccessKeyId=MYACCESSKEY
此输出与我与curl
使用的输出相同,以验证我实际上可以post
到S3
curl --request PUT --upload-file myfilename "https://mytestbucket.s3.amazonaws.com/mycoolkey?Signature=OX6vJCNjb4Pz3Fuzh0840qCnY5U%3D&Expires=1415394562&AWSAccessKeyId=MYACCESSKEY"
所以,这一切都很好,直到我尝试通过Javascript做同样的事情。
$.ajax({
url: 'https://mytestbucket.s3.amazonaws.com/mycoolkey?Signature=OX6vJCNjb4Pz3Fuzh0840qCnY5U%3D&Expires=1415394562&AWSAccessKeyId=MYACCESSKEY',
type: 'PUT',
data: 'sometestdata',
success: function() {
console.log('Uploaded data successfully.');
}
});
我在S3中设置了CORS设置以允许来自所有域的所有内容(在测试时),据我所知,js应该像curl那样发出相同的请求..所以...给出了什么?
为什么一个请求会失败而另一个请求失败,因为它们都使用完全相同的URL?