【问题标题】:Valid Access-Control-Allow-Origin responses有效的 Access-Control-Allow-Origin 响应
【发布时间】:2015-02-16 10:44:12
【问题描述】:

这类似于jquery ajax add authentication header,因为它与相同的 API 相关,但更多的是关于对 OPTIONS 请求的响应的有效值。

鉴于此:

$.ajax({
    url: "https://auspost.com.au/api/postcode/search.json?q=clayfield",
    headers: {
        'auth-key': '510839e3-****-****-****-6e04a56e9eb3'
    }
}, function (data) {
    var json = {
    json: JSON.stringify(data)
};
console.log(json);
});

我收到了这样的回复:

Access-Control-Allow-Headers:accept, auth-key
Access-Control-Allow-Methods:GET
Access-Control-Allow-Origin:
Access-Control-Max-Age:1200
Connection:keep-alive
Content-Length:0
Date:Fri, 13 Feb 2015 03:46:42 GMT
Server:nginx

这给出了一个错误:“Access-Control-Allow-Origin”标头包含无效值“”,这意味着我的来源不允许访问。

服务器为 Access-Control-Allow-Origin 标头返回一个空字符串(而不是我的来源或 *)是否有效?如果 有效 - 我怎样才能让我的请求正确验证?

【问题讨论】:

  • 您不应该将这些标头与请求一起发送...
  • 另外,由于您是通过 HTTPS 发送并且有凭据,所以不能使用 *,您必须实际指定来源。
  • 对不起,我已经删除了凭据,虽然有一个额外的 http 标头,但它不是授权请求。
  • 我使用http还是https也没关系,同样的结果。
  • 对,ssl 只是用于客户端证书,所以不应该影响它。我认为空字符串将是罪魁祸首。 null 是标头的有效值,但是,我认为 null 不会允许您从它请求,它需要是 * 或您的来源。

标签: jquery get cors


【解决方案1】:

“Access-Control-Allow-Origin”标头包含无效值,因为它在响应中为空白。响应必须返回 * 或实际的指定 ASCII 文本作为来源。

W3 建议如下

一个资源可以定义一个 Access-Control-Allow-Origin 标头。标头必须与以下 ABNF 匹配:

Access-Control-Allow-Origin = "Access-Control-Allow-Origin" ":" ascii-origin | “*”

请参阅:http://www.w3.org/TR/2008/WD-access-control-20080912/#access-control-allow-origin

正如其他人所建议的,由服务器根据您提供的授权和您的来源正确返回这些值。也许如果您不尝试发送服务器值,服务器将不会返回无效响应。

**更新 - 2015 年 2 月 15 日 **

经过进一步挖掘,我认为问题在于服务器设置与您的目标服务器以及 jquery / CORS 进程在浏览器中工作的组合。

似乎在服务器级别发生的情况是,如果 AUTH-KEY 不作为标头值存在,则服务器配置为在 Access-Control-Allow-Origin 响应标头中返回一个空字符串。这不符合标准,但有些人选择此作为安全预防措施,以确保不会发出无效的 CORS 请求。

由于 W3 (http://www.w3.org/TR/cors/#preflight-request) 为 CORS 定义的飞行前请求资源处理模型,此服务器行为会影响客户端行为,Jquery 和您的浏览器正在遵循该模型。

在您正确设置请求头中的 AUTH-KEY 的实际请求之前,会生成一个预检请求作为 OPTION 请求(代替 GET),以便让服务器有机会告诉客户端是否允许处理 CORS 策略和身份验证。

标准还指定您提供的标头实际上并未在此预检请求中发送,而是转换为称为“Access-Control-Request-Headers”(http://www.w3.org/TR/cors/#http-access-control-request-headers) 的单个标头值。对于您通过 jquery 的特定请求,您将看到以下标头转换:

Access-Control-Request-Headers: accept, auth-key

由于auth-key 没有传递给服务器,并且如上所述,您的服务器不会对 OPTION 请求返回“有效”响应,因为此 OPTION 请求不包含您的实际 AUTH-KEY 标头,而是Access-Control-Request-Headers 标头,正是这个空的 Access-Control-Response-Headers 响应在处理 XMLHttpRequest 时生成浏览器错误。

作为一种解决方案,我会尝试在您首选的服务器端页面(PHP、.NET 等)中设置一个本地服务器页面,该页面将执行一个简单的服务器到服务器请求,然后使用您的 ajax 请求针对您的本地服务器页面代理来解决上述 CORS 问题。

【讨论】:

  • 如果我只是发送 auth-key 它仍然返回一个空字符串:jsfiddle.net/meno/8bqvmzbp/5
  • 经过深思熟虑,认为上面的更新描述了发生的事情和潜在的解决方案
猜你喜欢
  • 2017-06-15
  • 2019-12-14
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2019-04-12
  • 2016-09-30
  • 2015-06-17
  • 2017-12-29
相关资源
最近更新 更多