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 阅读。
相关推荐
IT新视界4 小时前
星环科技ArgoDB:基于一体化架构构建数据全生命周期安全底座
数据库·科技·安全·架构
Java面试题总结4 小时前
多区域架构:边缘节点、核心节点与跨区域写冲突
架构
2301_780789665 小时前
零信任架构中,身份感知防火墙(IAFW)的部署要点与最佳实践
linux·运维·服务器·人工智能·tcp/ip·架构
lulu12165440785 小时前
OpenRouter Fusion 多模型融合架构深度拆解:预算级模型组团打平 Fable 5,多模型协作才是 AGI 的正确打开方式?
java·人工智能·架构·ai编程·agi
极光技术熊5 小时前
全栈项目部署实战指南:Java / Python / Vue / React 一站式搞定
程序员·架构
Solis5 小时前
Raft:分布式系统的定海神针
后端·架构
沪漂阿龙5 小时前
《LangChain 系列》Human-in-the-loop:什么时候必须让人工介入?
人工智能·架构·langchain
makise-6 小时前
破译大数据底层密码:从 HDFS 存储基石到现代分布式计算引擎的架构演进
大数据·hdfs·架构
zzqssliu6 小时前
基于策略模式与责任链的代购商品多源采集架构实战
架构·策略模式