Manifest V3版本Chrome扩展禁用重启后触发CORS错误问题求助
问题成因
这个是Chrome Manifest V3的已知权限同步缺陷:扩展禁用再重新启用后,已声明的host_permissions授权不会即时同步到已经注入或者即将注入的content script上下文,Chrome会误将这类跨域请求判定为普通网页的跨域请求,强制走CORS校验,所以才会出现首次加载正常、重启扩展后报CORS错误的问题。后端能收到请求是因为请求本身已经成功发出,只是Chrome在响应返回阶段拦截了内容,禁止返回给扩展上下文。
可行解决方案
- 方案1:优先使用background service worker代发请求
这是最稳妥的规避方案,background上下文的权限状态永远同步最新,不会出现权限缓存问题:- content script通过
chrome.runtime.sendMessage把请求参数发送给background - background收到请求后直接调用fetch发起请求,不需要做额外CORS配置
- background把请求结果通过消息回调返回给content script即可
- content script通过
- 方案2:扩展启动时主动刷新权限缓存
在background的事件监听中加入权限校验逻辑,主动触发Chrome更新权限缓存:// background service worker 代码 chrome.runtime.onStartup.addListener(async () => { const permissions = await chrome.permissions.getAll(); // 主动重新声明已有权限,触发缓存刷新,不会重复弹出授权提示 await chrome.permissions.request(permissions); }); chrome.runtime.onInstalled.addListener(async () => { const permissions = await chrome.permissions.getAll(); await chrome.permissions.request(permissions); }); - 方案3:请求时关闭CORS校验
如果你的请求不需要获取响应内容,可以直接在fetch参数中添加mode: 'no-cors';如果需要读取响应内容不推荐该方案。 - 额外注意:你当前配置的
https://*.ourdomain.com/*已经完全覆盖https://api.ourdomain.com的所有请求,不需要调整权限规则,如果后续新增其他域名请求,补充对应host_permissions规则即可。
内容的提问来源于stack exchange,提问作者bubbaspaarx
相关产品推荐
相关产品推荐

