在 Chrome 扩展中使用时,Fetch API 不发送会话 cookie
Posted
技术标签:
【中文标题】在 Chrome 扩展中使用时,Fetch API 不发送会话 cookie【英文标题】:Fetch API not sending session cookies when used inside a Chrome Extension 【发布时间】:2016-06-03 04:58:28 【问题描述】:我正在尝试制作一个 Chrome 扩展程序,它使用 Fetch API 从 Github 上的 Pull Requests 中抓取一些细节,然后将它们显示在其他地方。当我尝试将它与 Github 上的非公共存储库一起使用时,我遇到了一些问题。我相信这与 CSRF 保护以及管理 Chrome 扩展程序访问会话 cookie 的规则有关。
我的扩展程序的manifest.json
中有以下内容:
"content_scripts": [
"matches": [
"*://github.com/*/*/pulls"
],
"js": ["script/underscore-1.8.3.min.js", "script/content.js"]
],
"permissions": [
"tabs",
"activeTab",
"*://github.com/*",
"webNavigation"
]
但是当我从 script/content.js
中运行以下命令时:
fetch('/redacted/redacted/pull/4549', credentials: 'same-origin').then((response) =>
return response.text();
).then((text) =>
// do cool stuff
)
这会从 Github 生成 404 响应。使用 Chrome Inspector 的网络选项卡检查此请求,我可以看到它没有随请求一起发送我的 GitHub 会话标头。
如果我在 Inspector 中使用 javascript 提示符发出同样的请求,我可以看到 200 响应,并且我可以看到它正在发送我的会话 cookie。
我的理解是,在我的 manifest.json
中指定 Github 域意味着我的扩展程序可以访问我的内容脚本中的会话数据,这不正确吗?我应该怎么做才能对这个受保护的内容提出有效的请求?
【问题讨论】:
我也有这个问题,即使使用credentials: 'same-origin'
,fetch 也不会发送 cookie,而 XHR 只是发送所有内容,对我来说似乎是一个错误。
【参考方案1】:
根据Chrome blog,要包含您需要credentials: 'include'
而不是credentials: 'same-origin'
的cookie。
【讨论】:
虽然使用credentials: 'include'
确实是正确的解决方案,但您引用的博客文章绝不会支持您;它甚至没有提及 Chrome 扩展程序或credentials: 'same-origin'
(这是在fetch()
调用的init
参数中的有效选项,但不会在 Chrome 扩展的上下文中工作)。您需要credentials: 'include'
的真正原因是Chrome 扩展程序在一个名义窗口中执行,该窗口的URL 在chrome-extension://
方案上,因此绝对不是您可能想要的任何真实域的相同来源发出获取请求。
即使设置了credentials: 'include'
,我仍然无法发送cookies。我已经阅读了大量的 SO 问题,但没有运气。
我在使用 Chrome 扩展程序时遇到了同样的问题。它适用于相同的 Firefox 扩展,因此我相当确定所有 CORS-Headers 设置正确。 @PythonEnthusiast,您是否同时找到了解决方案?【参考方案2】:
在权限中指定 github 仅授予对主机的访问权限,如果扩展程序/应用程序受到恶意软件 (source) 的破坏,它会限制损坏。
content script documentation 中没有指出可以在内容脚本中检索会话数据,而只是在它们的 DOM 中检索。我认为如果你在你正在创建的 chrome 扩展项目中使用并合并官方 Github API 会更好。
【讨论】:
以上是关于在 Chrome 扩展中使用时,Fetch API 不发送会话 cookie的主要内容,如果未能解决你的问题,请参考以下文章
通过 Chrome 中的 Fetch API 在 D3 v5 中加载 JSON?
Chrome iOS 58 中 fetch API 返回的 TypeError