仅在从javascript发布到s3时才获得403响应?所有其他方法都可以

时间:2014-11-07 20:04:50

标签: javascript amazon-s3

我很担心这个。我试图从客户端直接发送一些数据到S3,而不是让我的网络服务器陷入困境。我正在使用Pythonboto库来生成签名,并且javascript(希望)将所有内容转换为S3。

我遇到的这个问题是每当我发送请求时,javascript都会给我以下错误:

  

我们计算的请求签名与您的签名不符   提供。检查您的密钥和签名方法。

我已经验证了(a)我的密钥有效,以及(b)我可以实际从S3上传/下载内容。我通过Python上传小型测试文件以及使用普通的“curl来完成此操作。

我的基本设置是:

  1. js阅读网站上的表格数据
  2. 向我的网络服务器发出请求以获取上传网址
  3. 使用url向S3发送ajax post请求
  4. 服务器端非常简单。它只是吐出一个用于上传的网址:

    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?

0 个答案:

没有答案