【问题标题】:Google Cloud Storage ignoring access control origin headers谷歌云存储忽略访问控制源头
【发布时间】:2017-11-26 02:16:41
【问题描述】:

我正在尝试通过 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 错误:

对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:3000” 访问。

如何通过 CORS?

【问题讨论】:

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


    【解决方案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,它将很高兴地响应跨域请求,而无需在存储桶上设置任何特殊属性。

    【讨论】:

    • 这是我的端点格式:“storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME]”,意思是把它改成“www.storage.googleapis.com/[BUCKET_NAME]/[ OBJECT_NAME]" ?
    • 这没有帮助
    猜你喜欢
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多