chrome 扩展开发(MV3), worker 后台发起 fetch 请求,无法设置 Sec-Fetch-xxx 请求头

2023-05-11 17:29:18 +08:00
 einsdisp

最近开发 chrome MV3 扩展程序,需要在 service worker 后台需要对一个网站的主页发起 http 请求,请求需要模拟用户在浏览器标签界面正常访问。

用户正常访问一个网站时,请求头包含如下特殊字段:

Sec-Ch-Ua: "......"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1

在 worker 后台使用 fetch(url, options),请求头却如下:

Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: none

二者明显不一样,网站可以通过请求头 Sec-Ch-xxxsec-fetch-xxx 判断是否是正常访问。 然而尝试设置 fetch 的 options 覆盖 headers

options.headers = {
  'Sec-Ch-Ua': '......',
  'Sec-Ch-Ua-Mobile': '?0',
  'Sec-Ch-Ua-Platform': '"Windows"',
  'Sec-Fetch-Dest': 'document',
  'Sec-Fetch-Mode': 'navigate',
  'Sec-Fetch-Site': 'none',
  'Sec-Fetch-User': '?1',
}

并没有用, Sec-Ch-xxxsec-fetch-xxx 这些特殊请求头根本不能设置。

尝试设置 options.mode = 'navigate',则直接保存。

请问有任何办法设置这些特殊请求头吗?

1194 次点击
所在节点    程序员
8 条回复
CLMan
2023-05-11 18:06:01 +08:00
根据我的少量的扩展开发经验,扩展提供的 API ,无论是内容脚本还是 worker ,都是受到浏览器安全策略限制的。

在 worker 进行 fetch 时,浏览器会使用 CORS 的方式来请求数据,我还没测试过设置 permissions 是否有效果。

至于内容脚本,似乎 cors 是不允许的(不太确定),只能访问同源的资源。

两者提供的 fetch/ajax api 都是受限的,并不是 local api 那样随意,要想不受限,可能要使用服务端来进行请求转发。
einsdisp
2023-05-11 19:32:57 +08:00
打错了,`尝试设置 options.mode = 'navigate',则直接保存。`
保存 => 报错
feedcode
2023-05-11 23:19:25 +08:00
proxy- 和 sec- 在 W3C Forbidden header name 里
https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name
CLMan
2023-05-11 23:40:56 +08:00
感谢分享,原来这一系列头信息有更专业的术语描述。
xifangczy
2023-05-12 02:27:54 +08:00
chrome.declarativeNetRequest API 可以修改
xifangczy
2023-05-12 02:29:37 +08:00
chrome.declarativeNetRequest.updateSessionRules({
removeRuleIds: [1],
addRules: [{
"id": 1,
"action": {
"type": "modifyHeaders",
"requestHeaders": [{
"header": "Sec-Ch-Ua",
"operation": "set",
"value": "test"
}]
},
"condition": {
"resourceTypes": ["xmlhttprequest"]
}
}]
}, function () {
// fetch 请求...
});
forty
2023-05-12 15:13:09 +08:00
chrome.declarativeNetRequest API 正解
japhetjiu699
34 天前
@xifangczy #6

补充
permissions: 加这两个参数

"declarativeNetRequestWithHostAccess",
"declarativeNetRequestFeedback"

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/939275

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX