我正在开发一个将通过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请求:
带有origin标头的POST请求:
答案 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相关。