【发布时间】:2019-01-14 19:21:26
【问题描述】:
我在通过弹出脚本中的 chrome 扩展处理 cookie 时遇到了一些问题。
popup.js 内容:
document.addEventListener('DOMContentLoaded', () => {
function cookieinfo() {
chrome.cookies.getAll({url: 'http://localhost:8080'}, function(cookie) {
console.log('Found cookie: ', cookie)
if (cookie == null)
return;
fetch('http://localhost:8080', {credentials: 'include'}).then((response) => {
// do some stuff
return response;
});
});
}
window.onload=cookieinfo;
}, false);
我执行的步骤:
- 在 localhost 上登录我的应用程序(所以我得到了 cookie)
- 打开弹窗(所以 popup.js 被执行)
- 我在控制台日志中看到 chrome 找到了必要的 cookie
- 服务器说传入请求的 cookie 为空
- 我刷新了本地应用程序的页面
- 我现在退出了
也许有人知道我做错了什么?
编辑:
看来原因是我的cookie有参数HttpOnly=true和SameSite=Lax(related link)。我可以在服务器日志中看到另一个 cookie。但是由于this thread,如果credentials 参数设置为include,所有cookie 都会被发送,即使是httpOnly cookie。由于this answer,我也尝试将其发送到 127.0.0.1 而不是 localhost,结果相同。
我无法将 httpOnly 设置为 false。这是框架强制的。有人知道怎么解决吗?
编辑2:
我终于安装了Cookie编辑器,发现SameSite=Lax是原因。如果我将其设置为No Restriction,那么我将在服务器端看到它。不幸的是,我使用的框架只允许Lax 和Strict 选项(Chrome 扩展程序都失败了)。有谁知道如何从 Chrome 扩展发送 Lax cookie?
【问题讨论】:
-
我会尝试 XMLHttpRequest。
-
popup.js 运行的 CPU 线程不是与浏览器主窗口运行的线程分开吗?我认为您在扩展程序的浏览器实例中设置了 cookie,但您需要在实际的浏览器窗口上下文中设置 cookie。
-
@TJBlackman 我尝试在 content.js 和 background.js 中执行此操作,结果相同。还是你的意思是另一回事?
-
@TJBlackman 看来,你是对的,因为
document.cookie返回空字符串。但是如果content_script不是解决方案,我该如何在浏览器窗口上下文中运行代码? -
这是一个相关的 Chromium 错误:bugs.chromium.org/p/chromium/issues/detail?id=617198
标签: javascript cookies google-chrome-extension httponly samesite