Google云端存储会忽略访问控制源标头

时间:2017-06-22 17:07:57

标签: ajax cors cross-domain google-cloud-platform google-cloud-storage

我试图通过本地主机上的谷歌云存储通过AJAX获取文件。我做了以下事情:

通过gsutil为我的存储桶设置CORS:

gsutil cors set cors.json gs://my-project

其中cors.json文件是:

[
  {
    "origin": [
      "*"
    ],
    "responseHeader": ["Origin", "Accept", "X-Requested-With", "Authorization", "Content-Type",     "Content-Length", "Accept-Encoding", "X-CSRF-Token"],
    "method": [
      "GET",
      "OPTIONS"
    ],
    "maxAgeSeconds": 1
  }
]

我已使用gsutil cors get gs://my-project

对其进行了验证

然后,对于每个文件,我都将其公开,在上传文件时都通过node.js客户端库:

bucket.file(object.name).makePublic()

通过控制台,并通过gsutil:

gsutil -m acl set -R -a public-read gs://my-project

然后在我的ajax请求中,我也发送标题:

$.ajax({
            method: "GET",
            url: "https://googleapis.com/storage/v1/b/my-project/o?delimiter=audio",
            headers: {
                'Access-Control-Allow-Origin': '*'
            },
            crossDomain: true,
        }).done((data) => {
            console.log(data)
        })

我仍然得到一个cors错误:

  

对预检请求的响应未通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:3000'因此是不允许的   访问。

如何通过CORS?

1 个答案:

答案 0 :(得分:3)

您正在使用" googleapis.com"而不是" www.googleapis.com"。添加" www"并且您的代码将有效。

您似乎没有进行任何身份验证,因此您还需要确保您的存储桶允许匿名用户列出对象(gsutil acl ch -g allUsers:R gs://bucket-name将设置该对象)。

接下来,对于匿名请求,添加将请求与您的Google Cloud项目相关联的API密钥参数是一种很好的做法。 GCS将允许完全匿名请求,但如果它们过于频繁,它们可能会被阻止。

最后,XML上的CORS策略仅受XML API的尊重。 JSON API,其端点为" www.googleapis.com",将很乐意响应跨源请求,而无需在存储桶上设置任何特殊属性。