【问题标题】:Chrome extension ignores XMLHttpRequest.withCredentials fieldChrome 扩展忽略 XMLHttpRequest.withCredentials 字段
【发布时间】:2012-09-22 13:23:29
【问题描述】:

我正在开发一个 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,这将返回在某些 DOM 元素中加载我的用户名的 stackoverflow.com。我的问题是:

  1. 这是按预期工作的行为吗?
  2. 如果是,是否有解决方法?从扩展内部发出 http 请求但忽略 cookie 或其他会话信息? (更新:忽略所有凭据信息,如客户端证书或 http 身份验证)

我正在使用最新的 (22.0.1229.79 m) Chrome。

【问题讨论】:

  • 这应该会有所帮助:stackoverflow.com/questions/11327593/…。我不确定withCredentials 应该如何/是否应该在 Chrome 扩展上下文中工作。
  • 经过测试的 webRequest API,它对我有用。恐怕这并不能解决我的问题,因为除了标头/cookies之外,还有用于凭据传输的afaik方法,例如客户端证书。我也不想使用隐身窗口解决方案。更新:不,webRequest 在扩展上下文下不起作用,所以我无法从扩展内部修改 XHR 的标头:(

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


【解决方案1】:

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

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

Requesting cross-origin permissions

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 不幸的是,我请求的所有网站都不支持 CORS(如果他们支持,就不会开发扩展),我不想使用那里列出的任何方法(可能有例外的屏幕外标签)所以恐怕你回答了这两个问题。
    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2011-09-27
    • 2011-07-19
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多