ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

深入atcoder-cli源码:如何用Cookie+事务机制实现安全的HTTP会话管理(完整指南)

深入atcoder-cli源码:如何用Cookie+事务机制实现安全的HTTP会话管理(完整指南) 深入atcoder-cli源码如何用Cookie事务机制实现安全的HTTP会话管理完整指南【免费下载链接】atcoder-cliAtCoder command line tools项目地址: https://gitcode.com/gh_mirrors/at/atcoder-cliatcoder-cli命令行工具acc是一款 AtCoder 竞赛命令行工具它的亮点之一是用本地 Cookie 文件 事务transaction机制实现了安全的 HTTP 会话管理登录态可跨命令复用密码不落盘且登录过程中任何一步失败都不会污染本地会话文件。本文将带你快速读懂这套设计的核心源码与实现思路。一、先认识 atcoder-cli它能做什么安装后你会得到一个acc命令常用操作如下命令作用acc login登录 AtCoder 账号会话保存到本地acc session检查当前是否处于登录状态acc logout删除本地会话文件acc new contest为比赛创建项目目录acc submit提交代码依赖 online-judge-tools其中login / session / logout三条命令背后就是本文主角——一套仅靠几百行 TypeScript实现的会话管理架构。二、架构总览三个文件各司其职 整个会话体系由三个模块组成依赖关系自上而下src/cookie.ts—— Cookie 类负责会话凭证的内存持有与本地持久化是数据库层。src/session.ts—— Session 类在 Cookie 之上封装 HTTP 请求并提供事务机制是事务层。src/atcoder.ts—— AtCoder 类面向业务处理登录、检查登录态、获取比赛/题目信息是业务层。三者通过轻量依赖注入DI装配在一起入口在 src/di/index.tsCookie → Session → AtCoder逐层绑定。测试时只需替换Cookie即可完全离线运行这是该架构可测试性好的关键。三、Cookie 类会话如何安全地落地先看 src/cookie.ts 中的Cookie类它做的事情非常克制只存keyvalue字符串数组。即 HTTP 请求头Cookie: ab; cd中ab、cd的部分完整定义见 Cookie 接口get / set / empty / clone / loadConfigFile / saveConfigFile。持久化交给conf库会话文件名为session存放在全局配置目录可用acc config-dir查看。读写仅两处loadConfigFile 与 saveConfigFile。密码永不落盘登录时账号密码通过inquirer从标准输入读取并直接发往服务器见 atcoder.ts 的 login本地文件里只有服务器下发的 Cookie。还有一个精巧的小工具 convertSetCookies2CookieArray把响应头里形如Set-Cookie: tokenabc; Path/; HttpOnly的整条头用一行正则解析成tokenabc——只保留键值对丢弃 Path、Max-Age 等浏览器才关心的属性让本地会话文件保持最小化。四、事务机制会话文件为什么不会被写坏这是全文最值得学习的部分。假设登录流程是取 CSRF token → 提交登录 → 保存新 Cookie如果第 3 步之前程序崩溃把半成品 Cookie写进文件用户下次运行就会带着坏会话只能手动清理文件。Session类的解法是数据库式的事务transaction(callback) ├─ 开事务clone() 一份 Cookie 副本标记 isUpdated false ├─ 执行 callback期间所有请求都使用副本 ├─ 成功副本转正若 isUpdated 为 true才写一次本地文件 └─ 失败副本丢弃本地文件原封不动对应源码在 Session.transaction。两个配套细节让它闭环读写切换getCookies 发现处于事务中时一律返回副本而非持久 Cookie因此事务内的请求看不到也影响不到磁盘状态。延迟落盘私有方法 saveCookie 是唯一的写盘闸门——事务中只把isUpdated置为true真正写文件推迟到事务提交的那一刻且整个事务只写一次。拒绝嵌套事务内再开事务会直接抛错session.ts L115-L117避免状态混乱。配套操作 removeSession 则把 Cookie 清空并覆盖写文件acc logout由此一行完成。五、登录全流程事务如何在业务层落地再看业务层 AtCoder.login把事务用起来只需return this.session.transaction(async () { ... })内部四步取 CSRF tokengetCSRFToken 用jsdom解析登录页 HTML 表单。注意此时会话里只有匿名态 Cookie调用saveSession()更新的是事务副本。读取账号密码inquirer交互式输入密码不回显、不经过文件。提交登录POST 到登录页maxRedirects: 0关闭自动跳转。判定成败若 302 跳转的Location不是/login视为成功调用response.saveSession()把新 Cookie 记入副本返回true使事务提交Cookie 才首次写入磁盘。密码错误时事务抛错或返回false副本连同其中的临时 Cookie 一起被丢弃——本地文件里仍是旧会话或空这就是失败不留痕。登录态检查同样聪明checkSession 访问abc001的提交页利用未登录会被 302 弹回的特性判断且结果带进程内缓存避免每条命令都发一次网络请求。六、测试视角事务行为如何被验证✅tests/tests/session.ts 用 mock 的 axios 验证了四个关键不变式事务内多次saveSession()saveConfigFile调用次数为0事务正常结束落盘恰好1 次嵌套事务必然抛错事务中途throwCookie 精确回滚到事务前的快照。另有 tests/tests/cookie.ts 覆盖Set-Cookie解析tests/utils/login.ts 则 mock 了inquirer让登录流程测试无需真人输入。七、快速上手体验# 克隆仓库 git clone https://gitcode.com/gh_mirrors/at/atcoder-cli # 或使用 npm 全局安装 npm install -g atcoder-cli acc login # 登录会话保存至本地文件 acc session # 检查登录状态 acc logout # 删除本地会话想亲手验证失败不留痕可以故意输错密码再用acc config-dir找到session.json查看内容——你会发现文件保持原样。八、总结这套设计教给我们什么设计点收益Cookie 只存keyvalue数组本地文件最小化、无敏感信息单写闸门saveCookie 事务延迟落盘原子性写入失败自动回滚clone()快照隔离事务内状态读写互不干扰实现简单却严谨DI 分层Cookie/Session/AtCoder业务逻辑可离线单测302 重定向判定登录态无需解析页面即可检查会话atcoder-cli 用不到 300 行的 Cookie Session 代码把会话安全这件复杂的事讲得非常清楚把易错的多步写操作包进事务让落盘成为唯一且可预测的瞬间。无论你在写 CLI 工具、爬虫还是任何需要持久化 HTTP 会话的 Node.js 项目这套 src/session.ts 的模式都值得借鉴。【免费下载链接】atcoder-cliAtCoder command line tools项目地址: https://gitcode.com/gh_mirrors/at/atcoder-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表