小编典典

Google Cloud Storage忽略访问控制来源标头

ajax

我正在尝试通过AJAX从本地主机上的Google云存储中获取文件。我已经完成以下工作:

通过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错误:

对预检请求的响应未通过访问控制检查:在所请求的资源上不存在“ Access-Control-Allow-Origin”标头。因此,不允许访问源’
http:// localhost:3000 ‘。

我如何通过CORS?


阅读 364

收藏
2020-07-26

共1个答案

小编典典

您使用的是“ googleapis.com”,而不是“ www.googleapis.com”。添加“ www”,您的代码即可使用。

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

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

最后,存储桶上的CORS策略仅受XML API的尊重。JSON API(端点为“
www.googleapis.com”的API)将很高兴地响应跨域请求,而无需在存储桶上设置任何特殊属性。

2020-07-26