atcoder-cli 登录机制揭秘:acc login 如何安全保存会话而不泄露密码

📅 2026/8/26 14:12:12
atcoder-cli 登录机制揭秘:acc login 如何安全保存会话而不泄露密码
atcoder-cli 登录机制揭秘acc login 如何安全保存会话而不泄露密码【免费下载链接】atcoder-cliAtCoder command line tools项目地址: https://gitcode.com/gh_mirrors/at/atcoder-cliatcoder-cli命令行工具acc是一个面向 AtCoder 算法竞赛的命令行工具可一键创建项目目录、拉取题目与样例测试、提交代码。本文带你完整看懂它的登录机制acc login为什么能把会话安全保存在本地同时绝不存储你的密码。一、什么是 atcoder-cli对于 AtCoder 竞赛选手来说atcoder-cli提供的acc命令把重复劳动压缩成一行acc login # 登录 AtCoder acc new ABC300 # 创建竞赛项目目录 acc add # 拉取题目和样例测试 acc submit # 提交代码 acc session # 检查登录状态 acc logout # 清除本地会话其中登录相关功能由 src/commands.ts 中的login/logout/session三个命令实现命令行入口定义在 src/cli/index.ts。那么问题来了一个命令行程序凭什么记住你已登录它存的是密码吗答案是不是。二、acc login 的完整流程三步走整个登录流程集中在 src/atcoder.ts 的login()方法中可以拆成三步第 1 步先确认是否已登录登录前会调用checkSession()。它的技巧很巧妙请求abc001竞赛的提交页并禁用自动重定向。如果你已登录页面正常返回未登录时 AtCoder 会把你 302 重定向回竞赛首页——收到 302 就判定为未登录。第 2 步获取 CSRF 令牌为防止伪造登录请求AtCoder 的登录表单要求携带csrf_token。getCSRFToken()方法用 JSDOM 在内存中打开登录页 HTML从隐藏表单里取出令牌——这一步刻意不使用任何已保存的 cookie确保拿到全新的一次性令牌。第 3 步输入凭证并一次性提交这是密码唯一露面的地方程序通过inquirer在终端交互提示中读取用户名和密码密码输入时显示为掩码而不是出现在命令行参数里命令行参数会被系统进程列表看到这是常见的泄露途径密码仅被拼进一次POST 请求发给 AtCoder请求立即结束字符串即被丢弃提交时同样禁用重定向若跳转目标不是/login页面即判定登录成功。源码中的注释直接点明了设计意图あまりパスワード文字列を引き回したくない——不想让密码字符串到处传递见 src/atcoder.ts。三、密码不落地只保存会话 cookie 登录成功后程序调用response.saveSession()把AtCoder 响应头Set-Cookie中下发的会话 cookie提取出来src/session.ts的makeSessionResponse交给 cookie 管理器持久化。关键设计在 src/cookie.ts它只认keyvalue形式的 cookie 字符串数组接口里根本没有存放密码的位置通过conf库把 cookie 写入标准配置目录下的session.json文件configName: session跨平台自动适配 Linux / macOS / Windows 的规范路径运行acc config-dir即可查看配置文件实际所在的目录命令定义见 src/commands.ts。换句话说本地文件里只有 cookie 这一把房间钥匙密码这把身份证从未离开过内存。后续所有请求查题、拉样例、提交都由 src/session.ts 的Session类自动把 cookie 附在请求头上无需再次输入凭证。四、事务机制登录失败不会弄坏现有会话 ✨Session.transaction()src/session.ts为整个登录过程套了一层事务开始登录时先克隆一份当前 cookie 副本登录过程中的一切 cookie 变更只发生在副本上只有登录成功副本才被提升为正式会话并写入配置文件若凭证错误、网络中断副本直接丢弃——旧会话完好无损。这和数据库事务的成功提交、失败回滚思想如出一辙保证任何一步出错都不会污染你已有的登录状态。五、日常使用检查与退出操作命令发生了什么检查登录状态acc session重访提交页判断是否被 302 重定向退出登录acc logout调用removeSession()清空 cookie 并覆写配置文件其他命令自动登录如acc contest未登录时自动触发一次login()交互流程logout的实现src/atcoder.ts只是把本地session.json清空——注意它清除的是本地钥匙不会让 AtCoder 服务端失效会话若想彻底安全还需在网页端退出登录。六、安全设计小结回顾acc login的整条链路它的不泄露密码靠的是四道防线交互式掩码输入——密码不进命令行参数、不进日志一次性使用——密码仅用于单次 POST用完即弃全程不落盘只存 cookie——持久化层的数据结构里根本没有密码字段事务保护——失败即回滚本地会话状态永远有效。配合 CSRF 令牌防伪造、302 重定向探测登录态atcoder-cli在命令行场景下实现了一套简洁而可靠的会话安全方案。想深入阅读可以直接查看这三个核心文件登录逻辑 src/atcoder.ts、会话事务 src/session.ts、cookie 持久化 src/cookie.ts以及组件组装方式 src/di/index.ts。【免费下载链接】atcoder-cliAtCoder command line tools项目地址: https://gitcode.com/gh_mirrors/at/atcoder-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考