Chrome扩展程序会忽略XMLHttpRequest.withCredentials字段

时间:2012-10-01 16:52:23

标签: google-chrome-extension xmlhttprequest session-cookies

我正在开发一个Chrome扩展程序,它在各种网站上生成XMLHttpRequest,但我注意到我的浏览器忽略了“withCredentials”字段。无论是设置为true还是false,响应始终相同,并包含通过浏览器中的简单URL导航请求的网页。

清单:

"background": {
    "scripts": ["jquery.min.js", "daemon.js"],
    "persistent": true
},
"permissions": [
    "<all_urls>"
]

内部daemon.js:

var xhr = new XMLHttpRequest();
xhr.open("GET", 'http://stackoverflow.com/', true);
xhr.withCredentials = false;
xhr.onload = function(e) {
    $('body').html(xhr.responseText);
}
xhr.send();

尽管将withCredentials设置为false,这将返回stackoverflow.com在某些DOM元素中加载我的用户名。我的问题是:

  1. 这是否符合预期的行为?
  2. 如果是,是否有解决方法?从扩展内部发出http请求但忽略cookie或其他会话信息? (更新:忽略所有凭据信息,如客户端证书或http身份验证)
  3. 我正在使用最新的(22.0.1229.79米)Chrome。

2 个答案:

答案 0 :(得分:1)

是的,此(正在发送的凭据的操作)是预期的行为。 XMLHttpRequest level 2 specification #withCredentials说(这是该部分的最后一行):

  

获取同源资源时,withCredentials属性无效。

显然,在Chrome扩展程序的上下文中运行的代码具有足够的权限(清单文件)会导致该属性的行为与请求来自同一源的行为相同。

我已经检查过从后台页面获取请求是否解决了任何问题,并得出结论认为它无济于事。如果其他站点支持CORS(通过标头),则解决方案是不提及清单文件的"permissions"部分中的站点。 所有其他选项都在this answer中突出显示。

如果没有一种方法令人满意,那么问题二的答案是“不,没有解决办法”。

答案 1 :(得分:0)

您需要在 Chrome 扩展程序中将 API 端点列入白名单。示例:

{
  "name": "My extension",
  ...
  "host_permissions": [
    "https://stackoverflow.com/"
  ],
  ...
}

Requesting cross-origin permissions