Google app engine 否';访问控制允许原点';具有可恢复上载的标头

Google app engine 否';访问控制允许原点';具有可恢复上载的标头,google-app-engine,google-api,xmlhttprequest,google-cloud-storage,Google App Engine,Google Api,Xmlhttprequest,Google Cloud Storage,我们正在通过云存储JSON API从我们的应用程序引擎应用程序生成可恢复的上传url,该应用程序可用于移动应用程序和web应用程序。 在web应用程序中,使用XmlHttpRequest上载带有可恢复上载url的文件时,我们会得到以下错误: XMLHttpRequest无法加载。。。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“” 在Chrome developer tools中,网络日志显示第一个选项请求,该请求具有相应的“源”请求头和“

我们正在通过云存储JSON API从我们的应用程序引擎应用程序生成可恢复的上传url,该应用程序可用于移动应用程序和web应用程序。 在web应用程序中,使用XmlHttpRequest上载带有可恢复上载url的文件时,我们会得到以下错误:

XMLHttpRequest无法加载。。。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”

在Chrome developer tools中,网络日志显示第一个选项请求,该请求具有相应的“源”请求头和“访问控制允许源”响应头,但如下所述,PUT请求失败

桶上的cors xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
    <CorsConfig>
      <Cors>
        <Origins>
          <Origin>*</Origin>
        </Origins>
        <Methods>
          <Method>PUT</Method>
          <Method>GET</Method>
          <Method>POST</Method>
          <Method>HEAD</Method>
          <Method>DELETE</Method>
          <Method>OPTIONS</Method>
        </Methods>
        <ResponseHeaders>
          <ResponseHeader>*</ResponseHeader>
        </ResponseHeaders>
        <MaxAgeSec>1800</MaxAgeSec>
      </Cors>
    </CorsConfig>

*
放
得到
邮递
头
删除
选择权
*
1800
欢迎提出任何建议


谢谢。

端点
https://www.googleapis.com
不允许跨源资源共享(CORS)。这意味着,所有浏览器都将阻止从未在源主机(www.googleapis.com)上运行的网站发出的请求

确保为铲斗配置了CORS,例如:

<?xml version="1.0" encoding="UTF-8"?>
<CorsConfig>
  <Cors>
    <Origins>
      <Origin>https://ourapp.appspot.com</Origin>
    </Origins>
    <Methods>
      <Method>GET</Method>
      <Method>HEAD</Method>
      <Method>PUT</Method>
    </Methods>
  </Cors>
</CorsConfig> 

https://ourapp.appspot.com
得到
头
放

如果仍不能正常工作,请尝试使用curl并报告结果。

问题不在于上面显示的CORs文档。如果xhr请求是formdata,则可以使用xhr上载文件,如下所述:。如果请求不是FormData,则会出现“Access-Control-Allow_Origin”错误

这对我很有用:

$("input[type=file]").change(function() {

    var formData = new FormData();

    formData.append("field, ...);
    formData.append("field, ...);
    formData.append("file", filesList[0]);

    var xhr = new XMLHttpRequest();
    xhr.open('POST', "https://my-bucket.storage.googleapis.com/", true);
    xhr.onload = function(e) { 
        console.log("File Uploaded!")
    };

    xhr.send(formData);
}

请参见完整的working node.js示例:

这是使用JSON API的可恢复上载的已知问题。我假设用于启动可恢复上传的“来源”和用于上传数据的“来源”在您的情况下是不同的,对吗

该问题涉及两个部分:

1) 使用可恢复上载协议时,第一个(开始上载)请求中的“来源”始终用于确定响应中的“访问控制允许来源”标题,即使您对后续请求使用不同的“来源”

2) GCS中的CORS配置仅适用于XML API。我认为我们的文档可能需要一些改进来使这一点更加清楚,现在这里只提到了()如果您点击链接查看什么请求URI将响应CORS配置。JSON API忽略CORS配置,并始终允许对请求中的“源”进行跨源访问

因此,如果您将resumable upload与JSON API一起使用,它将只使用第一个请求中的“origin”,并将“access control allow origin”头设置为该origin。因此,如果源站在后续上传请求中发生更改,它们将无法工作

目前,您有两种解决此问题的方法:

1) 对第一个和后续请求使用相同的来源


2) 切换到使用XML API,并将CORS配置设置为*

我的帖子请求包含内容长度(设置为0)、x-upload-content-type和来源,一切正常


[1]

我也遇到了同样的问题,解决方案是添加一个标题
Origin:“https://ourapp.appspot.com“
发送到初始可恢复请求

但是,由于以下变量,某些库(例如
sun.net.www.protocol.http.HttpURLConnection
)不允许您更改
Origin
标题:

restrictedHeaders=新字符串[]{“访问控制请求头”、“访问控制请求方法”、“连接”、“内容长度”、“内容传输编码”、“主机”、“保持活动状态”、“源站”、“拖车”、“传输编码”、“升级”、“通过”}

我的解决方法是使用一个库创建一个新的HttpRequest,该库允许更新
Origin
标题。我在我的案例中使用了Okhttp(作为前Android开发人员)

OkHttpClient=new-OkHttpClient();
AppIdentityService AppIdentityService=credential.getAppIdentityService();
集合作用域=credential.getScopes();
字符串accessToken=appIdentityService.getAccessToken(作用域).getAccessToken();
Request Request=newrequest.Builder()
.url(“https://www.googleapis.com/upload/storage/v1/b/“+bucket+”/o?name=“+fileName+”&uploadType=可恢复”)
.post(RequestBody.create(MediaType.parse(mimeType),新字节[0]))
.addHeader(“X-Upload-Content-Type”,mimeType)
.addHeader(“X-Upload-Content-Length”,“长度+长度”)
.addHeader(“原点”https://ourapp.appspot.com")
.addHeader(“原点”、“*”)
.addHeader(“授权”、“承载人”+访问令牌)
.build();
Response=client.newCall(request.execute();
返回响应。标题(“位置”);

我非常确定它与描述的一样,并且我看到它与GET请求一起工作。检查您是否将
PUT
列为桶的CORS配置中的方法的一部分。我已经允许CORS配置中的每个方法都有任何来源,但它没有帮助。我遇到了同样的问题——CORS设置正确,我没有任何其他服务终结点的问题。你修复过吗?@ovangle没有,我们暂时放弃使用上传URL,而是使用。你在PUT请求中使用了吗?我实际上遇到了完全相同的问题@akgill我相信?cors查询字符串用于更改与bucket关联的cors头。不是像我们在这里尝试的那样,向bucket发出可恢复的上传请求。您不需要在bucket上设置CORS。在请求可恢复上传url时,只需正确设置来源