从浏览器上传到S3时,为什么会出现403错误?

时间:2015-08-28 18:48:29

标签: javascript amazon-web-services amazon-s3 cors dropzone.js

所以我试图在这里查看以前的答案,似乎没有任何工作。我正在使用Dropzone,它似乎发出OPTIONS请求以获取所有允许的CORS相关信息,但它似乎没有正确返回

因此,通过查看Chrome开发工具,我有以下请求标头

Host: mybucket.s3.amazonaws.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:9010
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36
Access-Control-Request-Headers: accept, cache-control, content-type, x-requested-with
Accept: */*
Referer: http://localhost:9010/upload
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

这些是我得到的响应标题

HTTP/1.1 403 Forbidden
x-amz-request-id: 9BE37C4F32052EAB
x-amz-id-2: Zxg+v9AQ7G7sgMKz4P7xleUhrymyWGbBNNof8jFFsZ5n0Xw8T/mPovbMO55HZ5fL
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Fri, 28 Aug 2015 18:35:26 GMT
Server: AmazonS3

根据AWS documentation我应该获得访问控制 - 允许 - 方法访问控制 - 允许 - 标题之间的东西,但我不知道似乎是。

我知道我的存储桶有效,并且网址有效且存储桶中的CORS文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

因此,就发送的表单数据而言,我有以下内容:

acl
key
policy
x-amx-credential
x-amz-algorithm
x-amz-date
x-amz-signature

除了文件数据。我不认为我有什么遗失

3 个答案:

答案 0 :(得分:3)

唉,这是超级愚蠢的。似乎根据enabling CORS上的页面,OPTIONS请求:

  

预检请求中请求的Access-Control-Request-Headers标头中列出的每个标头必须与AllowedHeader元素匹配。

意思是我必须在我的CORS策略中添加一堆以前缺少的行

<AllowedHeader>accept</AllowedHeader>
<AcceptHeader>cache-control</AcceptHeader>
...

答案 1 :(得分:2)

根据docs on enabling cors,你应该可以简单地使用*,这样你就不必全部列出:

<AllowedHeader>*</AllowedHeader>

答案 2 :(得分:0)

如果有人在努力解决这个问题,那么403就可以了,因为设置了错误的contentType。

服务器端:

GeneratePresignedUrlRequest rq = new GeneratePresignedUrlRequest(bucketName, objectKey);
rq.setContentType("video/*");
...

客户方:

$.ajax({
                url:upUrl,
                type: "PUT",
                data: file,
                contentType:'video/*',
                cache: false,
                processData:false,
                success: function (data) {

                }
              });