Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] how to manage cookie #965

Merged
merged 1 commit into from May 1, 2022
Merged

[RFC] how to manage cookie #965

merged 1 commit into from May 1, 2022

Conversation

ctrl2wei
Copy link
Contributor

@ctrl2wei ctrl2wei commented May 1, 2022

遇到的问题:同一根域名下的网站登陆状态不一致,退出网站后刷新页面或重启 Emacs 打开页面,网站又自动登陆上了。

我的理解是当前的方案是使用网站 URL 的 hostname 来存储页面的 cookie 会出现一个问题,同一个 cookie 可能会出现在不同的目录中。

出现以上现象原因:

  • 如果同时访问了一个网站顶级域名和二级域名,如 baidu.com (host 为 baid.com) 和 news.baidu.com (host 为 news.baidu.com),域名为 .baidu.com 的 cookie 就有可能同时出现在两个目录,加载 cookie 时这两个网站是各加载各的。
  • 网站域名重定向(如 www.github.com 会重定向到 github.com ,或 baidu.com 会重定向到 www.baidu.com)
  • QWebEngineView 会存储 cookie 到本地文件的缓存文件(我电脑中是 ~/.local/share/eaf.py/QtWebEngine/Default/Cookies ),打开页面的时候好像也会从中读取 cookie 信息

我试着改了一个类来处理 cookie

  • 首先,还是用名字为 cookie domain 的文件夹来归类改域下的 cookie,所有 cookie 还是保存为以 cookie name 为名的文本文件
  • 禁止 QWebEngineView 存储 cookie 到本地文件,只存储在内存中就行了。
  • 读取 cookie 时按照 https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.3 描述的用 QUrl 返回的 host 和所有的 cookie domain 文件夹名比较,符合要求的就加载(不知道当 cookie 文件夹多起来时有没有效率问题)。
  • 删除 cookie 有不同的做法,firefox 在设置中手动删除 cookie 貌似只能选择根域名,它会连同子域名的 cookie 一起删除。 chrome 在设置中可以列出所有根域名和子域名,可以单独删除各个域名的 cookie,我写的代码中引入了一个 python 包 tld,用它来获得当前域名的根域名,再用根域名找到所有的子域名,然后一起删除。当然也可以直接用 QUrl 返回的 host 去匹配 cookie domain 文件夹名,然后删除文件夹下所有的 cookie,(这里有个问题,例如百度页面的 host 是 www.baidu.com 而页面 cookie 的 domain 有 www.baidu.com 也有 baidu.com。)。还有就是直接返回所有 cookie 的文件夹,让用户自己选择删除。我只试着实现了类似和 firefox 操作。

代码不是很健壮,只是提供一种思路,希望有帮助。

@manateelazycat
Copy link
Member

@ctrl2wei 感谢大佬补丁,从我上周的研究看,cookie 会有两种情况,一种是以点开头的,比如 .github.com , 一种是没有点开头的,比如 github.com, 点开头的主要兼容IE浏览器,现代浏览器基本只看非点开头的 cookie.

从我上周研究 github.com 的返回 cookie 看,github.com 会同时返回 .github.com 和 github.com 两种 cookie, 两种 cookie 的内容并不相同, 如果直接把 .github.com 的文件合并成 github.com , 估计会导致内容相互影响,最后返回服务器的时候也会出错。

大佬怎么看这种情况? 我对Cookie的研究还不够深入。

@ctrl2wei
Copy link
Contributor Author

ctrl2wei commented May 1, 2022

我觉对前端也不是很了解,照理说现在对 cookie 来说带点与不带点的都可以作用到子域名,只是格式问题,我不理解这种情况。

@manateelazycat
Copy link
Member

我又看了一遍你的源代码,其实带不带点都只是子目录名, cookie name 还是按照 cookie 里面的 name 来存储的,除非服务器返回的 .github.com 和 github.com 域名都有同样 name 和 value 的时候才会相互影响。

因为现在是按照 cookie 里面的 name 来存储文件的,所以问题应该不大,我先合并, 后面有问题再继续修复。

感谢大佬的补丁, awesome!

@manateelazycat manateelazycat merged commit 32e6cb9 into emacs-eaf:qt5-legacy May 1, 2022
@ctrl2wei
Copy link
Contributor Author

ctrl2wei commented May 1, 2022

@manateelazycat 代码里面我引入了新的库 https://pypi.org/project/tld/ ,我是从 pip 安装的,因为不知到所有系统里面的包名是什么所以还没有添加依赖。

manateelazycat added a commit that referenced this pull request May 1, 2022
@manateelazycat
Copy link
Member

tld 依赖我已经添加了,谢谢提醒。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants