在 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

如何在网站完成加载动态内容之前延迟fetch()

防止使用 fetch 发送多个 http 请求

使用 Javascript fetch 命令从 google chrome 控制台请求新闻 API 运行命令时出现问题

Safari 不使用 JS Fetch API 设置 CORS cookie