Harness 与 Koa2 登录实践(二):小步能跑通——从 `/health` 到会话 Cookie

配套开源仓库harness-login-now-koa2

建议先读系列(一)或直接打开仓库中的 implement guide/NOTES-API-CONTRACT.md 作为单一事实来源;本文与 implement guide/V1/KOA2登录系统-Harness与Cursor分步指南.md 阶段 1~4、5 前半对齐。


这篇在讲什么

(一)里说了:先契约,再写代码 。这一篇用递进 方式走一遍「最小可运行 → 能注册用户 → 能登录并保持会话」------每一步都只加一个能力,避免一次改太多无法归因

技术栈在仓库里是固定的:Node + Koa 2koa-routerkoa-bodyparserbcryptkoa-session ,用户开发期落在 data/users.json 。模块格式为 CommonJS (与根目录 package.json 一致)。


阶段 1:把环境钉住(环境即契约)

通俗目标 :换一台机器也能 npm install 后跑起来,不依赖「我全局装了啥」。

  • package.json + lockfile 锁依赖版本。
  • npm install 报错,先把终端完整输出贴给助手或自己归类:网络、权限、Node 版本------对应 Harness 里「错误分类再升级策略」,而不是盲改代码。

仓库根目录执行:

bash 复制代码
npm install
npm start

默认端口 3000 ,可用环境变量 PORT 覆盖(细节见仓库 README.md)。


阶段 2:只要一个回声------GET /health

通俗目标:证明「HTTP 层 + 进程监听」已经 OK,再叠业务。

实现一个 GET /health ,返回形如 { "ok": true } 的 JSON。验收一行就够:

bash 复制代码
curl -sS http://127.0.0.1:3000/health

这就是 Harness 里常说的 checkpoint:后面登录出问题,可以先确认 health 仍正常,缩小排查面。


阶段 3:用户与密码------POST /register

通俗目标 :能把用户存下来,且磁盘上没有明文密码

  • 用户列表存在 data/users.json(数组);启动时读入,变更后写回。
  • 注册接口 POST /register :body 里 username / password;成功返回 201{ ok, user }不要返回 password。
  • 用户名冲突返回 409 ,字段不合法返回 400 ,错误体统一 { error, message }(机器可读码 + 人话说明)。

密码用 bcrypt 生成 passwordHash 再写入 JSON。这样即使文件泄露,也不是「一眼能登录」的明文。

小验收 :同一用户名注册两次,第二次应 409 ;若变成 500,多半是校验或写入逻辑遗漏,对照契约修。


阶段 4:登录与会话------POST /login 与 Cookie

通俗目标 :登录成功后,浏览器(或 curl 的 cookie 罐)里有一个 httpOnly 的会话 Cookie,服务端能认出「你是谁」。

本仓库契约约定:

  • Cookie 名:app_session
  • 属性建议:HttpOnly; Path=/; SameSite=Lax(本地调试用;跨站场景以后要单独设计)
  • Session 里只放 userId / username 等业务需要字段,不要放密码。

curl 技巧 :用 -cSet-Cookie 写入文件,用 -b 带上文件访问受保护接口。契约里的五条示例在 NOTES-API-CONTRACT.md「验收用 curl 示例」一节。

登录成功应 200 ,响应体带 { ok, user },响应头带 Set-Cookie 。若登录后访问 /me401 ,常见原因是:中间件顺序、Cookie 的 Path/域名、或 session 未正确挂载------把 curl -v 的请求与响应头贴出来排错,比猜更快(分步指南阶段 4 也强调了这一点)。


阶段 5(本篇收尾):GET /me 与中间件顺序

通俗目标 :未登录统一 401;已登录返回当前用户,且不在每个路由里复制粘贴鉴权代码。

做法是把鉴权抽成 requireAuth 一类中间件,并保证:先 session 解析,再鉴权,再业务 。仓库 HARNESS-SELF-CHECK.md 里用一句话对应了「上下文如何被组织」:错误壳 → 解析 JSON →(开发日志)→ Session → 路由/me 再串 requireAuth

验收思路:

bash 复制代码
curl -sS -c cookies.txt -H 'Content-Type: application/json' \
  -d '{"username":"alice","password":"secret123"}' \
  http://127.0.0.1:3000/login
curl -sS -b cookies.txt http://127.0.0.1:3000/me

具体字段名与状态码仍以 implement guide/NOTES-API-CONTRACT.md 为准。


小结

阶段 你证明的事
health 进程与 HTTP 通
register 持久化 + bcrypt + 错误码
login session + Cookie 链路通
/me 鉴权与中间件顺序正确

每一步都尽量 可 curl ,这和「一次让 AI 生成全部路由」相比,更利于交接和复盘


下一篇与仓库

  • (三) 会讲:npm run verify 脚本闭环HARNESS-SELF-CHECK 自检 、以及 SESSION_KEYS、CORS、多实例不写同一 users.json 等运维向边界------也就是「怎么证明整条链路在干净环境里也能绿」。
  • 源码、契约全文、分步指南与 Windows 验收脚本 均在:github.com/RonnyJung20... 。欢迎对照 src/index.jssrc/userStore.jsscripts/verify-flow.sh 阅读。
相关推荐
会周易的程序员5 小时前
aiDgePLC iec61131 虚拟机 完整使用文档
c++·物联网·架构·st·iec61131
宇擎智脑科技7 小时前
DeepSeek Harness 架构解析:MCP 和 Skill 如何被统一为 Cordis 插件
架构·deepseek·harness·dsh
这个DBA有点耶9 小时前
分布式数据库到底该不该上?从判断标准到架构选型的实战思考
数据库·架构·dba
楚识科技9 小时前
破除通用瓶颈——企业级OCR定制化开发的架构思维与实战范式
架构·ocr
刘立军9 小时前
RESTful 与契约优先:规范接口定义,统一接口设计范式
后端·架构·ai编程
heimeiyingwang10 小时前
【架构实战】分布式事务:从CAP定理到Seata实战,一文讲透跨服务数据一致性
分布式·架构
独孤九剑打醒他10 小时前
RGB‑TOT 全架构系统仿真:红外波长簇光通信完整验证
架构
这个DBA有点耶11 小时前
从库延迟的“二次放大”效应:一次大事务,拖垮整个读写分离
数据库·mysql·架构
张宇Joaquin12 小时前
高性能模板库Eigen架构分析及性能优化实践
性能优化·架构
AI产品测评官13 小时前
AI 招聘系统的三代技术演进:从 DOM 注入到视觉语义读取的架构拆解
人工智能·架构·求职招聘