即使服务器域URL已添加到权限中,源标头也会出现在Chrome应用中的非GET请求中

时间:2014-03-05 13:03:17

标签: cors google-chrome-app

我正在开发一个将通过RESTful API与服务器通信的chrome应用程序。

如果不将服务器URL添加到manifest.json中的权限,我可以看到Chrome使用origin标头(chrome-extension:// cpndc ....)发送所有请求,如果这些请求中的任何一个请求没有 - 标准标题它还发送预检OPTIONS请求 - 这都是预期的。

将域添加到权限后,不再发送预检OPTIONS。原始标头在GET调用中不存在,但它仍然存在于POST,PATCH和MERGE调用中。

这会导致问题,因为我将使用的服务器上的CORS实现假设带有origin头的请求是CORS请求并且响应403错误,因为它不喜欢原点 - 这个带有chrome扩展的源不在列表中被接受的起源。

根据CORS规范,期望原始标头只应添加在跨域请求https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS#Origin中,但由于服务器域已添加到权限中,我不仅会期望获得GET而且还需要其他请求没有。

问题是:这是Chrome Apps CORS实施中的错误吗?

使用Chrome应用时我的调查结果摘要:

如果端点URL未添加到清单文件中的权限(CORS将启动): - Chrome应用会在所有类型的请求中发送原始标头 - Chrome应用为所有具有非标准标头的请求发送OPTIONS预检

如果将端点URL添加到清单文件中的权限(对该域的请求的安全性已关闭) - Chrome Apps不再发送OPTIONS预检(正如预期的那样) - Chrome应用仅在非GET请求中发送原始标头(根本不应发送源)

示例权限文件:

  "permissions": [
"http://api.randomuser.me/*"

应用代码示例:

window.onload = function() {

function get(){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://api.randomuser.me/?seed=bigFish", true);
    xhr.setRequestHeader('Authn', 'abcdefghijklmnopqrstuvxyz');
    xhr.onload = function (e) {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          console.log(xhr.responseText);
        } else {
          console.error(xhr.statusText);
        }
        post();
      }
    };
    xhr.onerror = function (e) {
      console.error(xhr.statusText);
    };
    xhr.send(null);   
}

function post() {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'http://api.randomuser.me/', true);
    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xhr.setRequestHeader('Authn', 'abcdefghijklmnopqrstuvxyz');
    xhr.onload = function () {
        // do something to response
        console.log(this.responseText);
    };
    xhr.send('user=person&pwd=password&organization=place&requiredkey=key');
}

document.getElementById('mybutton').addEventListener('click', function() {
    get();
});

};

没有原始标题的GET请求: GET request without the origin header

带有origin标头的POST请求: POST request with the origin header

1 个答案:

答案 0 :(得分:4)

我刚刚在StackOverflow上找到了类似的问题:

Chrome adding Origin header to same-origin request

并且其中一个答案指向了规范:rfc6454#section-7.3:

http://tools.ietf.org/html/rfc6454#section-7.3

根据它,用户代理可以在任何HTTP请求中包含Origin头字段。

这意味着origin头不必与CORS相关。