【问题标题】:CORS set but not effecting the requestCORS 设置但不影响请求
【发布时间】:2021-02-09 12:04:54
【问题描述】:

我正在尝试使用 getSignedURL 方法在使用 Firebase 函数生成的链接上创建一个头请求。

我想检查该 URL 是否仍然有效并且没有过期

对于 cors,我使用 cloud.google.com 上 cloud shell 中的 gsutils 并设置了 cors:

gsutil cors set cors.json gs://mybucket.appspot.com
Setting CORS on gs://mybucket.appspot.com/...
di@cloudshell:~ (ecutter-web)$ gsutil cors get gs://mybucket.appspot.com
[{"maxAgeSeconds": 300, "method": ["HEAD"], "origin": ["https://myapp.web.app"],         
"responseHeader": ["Access-Control-Allow-Origin"]}]

但是当我向该 URL 发出头部请求时,它会显示错误:

跨域请求被阻止:同源策略不允许读取位于https://storage.googleapis.com/myapp.appspot.com/public/myfile.doc?GoogleAccessId=firebase-adminsdk-7u2d7%40myapp.iam.gserviceaccount.com&Expires=1603783901&Signature=.. 的远程资源。 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。

这是 cors.json:

[
    {
      "origin": ["https://myapp.web.app"],
      "method": ["HEAD"],
      "responseHeader": ["Access-Control-Allow-Origin"],
      "maxAgeSeconds": 300
    }
] 

原来的appname被myapp替换了。

以及检查有效性的功能:

function loadhandle() {
        console.log('logging');
        console.log(this.responseText);
    }
    function checkUrl(s) {
        console.log('creating request');
        var xml = new XMLHttpRequest();
        xml.addEventListener("load", loadhandle, false);
        xml.open("HEAD", s);
        xml.send();
    } 

问题出在哪里?

【问题讨论】:

    标签: javascript google-cloud-functions google-cloud-storage firebase-storage gsutil


    【解决方案1】:

    我在下午设置了CORS,所以我的连接不是那么快,我发现云外壳正在努力启动和运行。

    所以

    您可以使用gsutilsgetSignedUrl 上设置CORS,我使用console.cloud.google.com 中的Cloud shell 来避免任何安装。

    首先在云 shell 中通过运行命令检查是否存在任何 CORS 配置:

     gsutil cors get gs://yourstoragebucketname
    

    然后使用上传文件菜单项上传您的CORS 文件。在我的情况下,文件名是cors.json

     gsutil cors set cors.json gs://yourstoragebucketname
    

    再次调用验证CORS是否设置正确

     gsutil cors get gs://yourstoragebucketname
    

    您的cors.json 应如下所示:

    [
       {
          "origin":[
             "https://myapp.web.app",
             "http://localhost:5000"
          ],
          "method":[
             "HEAD"
          ],
          "responseHeader":[
             "Access-Control-Allow-Origin"
          ],
          "maxAgeSeconds":300
       }
    ] 
    

    【讨论】:

      【解决方案2】:

      来自谷歌文档:

      经过身份验证的浏览器下载端点 storage.cloud.google.com 不允许 CORS 请求。请注意,Cloud Console 为每个对象的公共 URL 链接提供此端点。

      您可以使用以下任一 XML API 请求 URL 从 Cloud Storage 获取包含 CORS 标头的响应:

      storage.googleapis.com/BUCKET_NAME
      

      BUCKET_NAME.storage.googleapis.com
      

      查看你遇到的错误:

      Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at 
      https://storage.googleapis.com/...(Reason: CORS header ‘Access-Control-Allow-Origin’ missing). 
      

      Reference

      让我知道这是否适合你。

      【讨论】:

      • 嘿@tzovourn,我实际上不明白你真正想说什么?在提出请求时以storage.googleapi 作为主持人说?如果是,那么getSignedUrl 默认返回链接,就像你说的storage.googleapis.com/myBucket/pathtofile and so on 但是现在我认为它正在工作,所以似乎需要一些时间才能在存储桶中更新。
      • 奇怪的是,CORS 仅在状态码为 200 的情况下才有效,这就是我所需要的,但在其他情况下,我们需要/想要处理所有这些情况,我不知道也许是一个新的 stackoverflow 问题?
      • 请打开一个新的 StackOverflow 问题,说明此问题的所有详细信息。
      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2016-07-21
      • 2012-04-26
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      相关资源
      最近更新 更多