fix: harden auth middleware against transient db errors
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
- P6.17 Controlled Worker Concurrency Canary: 已完成,external worker 短窗口提升到并发 2,两条真实 code-run 同时 running 并全部通过 receipt validation。
|
||||
- P6.18 Concurrency Rollout Policy: 已完成,生产 worker 和 Portal runtime/status 已对齐到并发 2,worker KeepAlive 保持开启,保留回滚备份。
|
||||
- P8.1 Queue Lease / Stuck Run Recovery: 已完成第一步,worker dispatch 前自动回收超时 running run,新增 `--recover-stale` dry-run/apply 运维入口,生产 synthetic stale run 验证通过。
|
||||
- P8.2 Portal DB/Auth Transient Error Hardening: 已完成第一步,session attach、`/auth/status` 和 API auth middleware 已捕获 DB/auth 瞬时错误,生产部署后 live health、auth/status、runtime/status、guard 和 SLO 验证通过。
|
||||
- P5.15 Active Stream TTL Reconcile: 已按用户要求跳过,暂不做报表/定时 reconcile。
|
||||
- P5 Worker Pool 运维化: 已完成第一步,Redis Router 支持 worker drain。
|
||||
- P5.9 First-token Latency EWMA: 已完成,StreamController 会把首个 SSE chunk 延迟写入 Redis,SLO 报告已展示。
|
||||
@@ -2805,6 +2806,63 @@ runtime/status:
|
||||
- guard `shouldPause=false`
|
||||
- SLO `ok=true`, `failures=[]`
|
||||
|
||||
### 2026-07-02 P8.2 Portal DB/Auth Transient Error Hardening
|
||||
|
||||
目标:
|
||||
|
||||
- 防止 session verify / auth status / API auth 中的 MySQL 或 socket 瞬时错误扩大为进程级异常。
|
||||
- 将认证依赖临时不可用时的用户可见结果收敛为 503,而不是 uncaught rejection 或 Portal 退出。
|
||||
- 保持 plaza public read 路径在 session attach 瞬时失败时仍可继续读取。
|
||||
|
||||
改动:
|
||||
|
||||
- `attachUserSession()`:
|
||||
- 捕获 `userAuth.verify(token)` 异常。
|
||||
- 写入 `req.userSessionError`,记录 `[Auth] session verify failed`。
|
||||
- 不让异常穿透 Express middleware。
|
||||
- `/auth/status`:
|
||||
- 捕获 `getMe()`、`getUserById()`、`resolveUserCapabilities()` 异常。
|
||||
- 返回 `503 { authenticated:false, mode:'unavailable' }`。
|
||||
- API auth middleware:
|
||||
- 对 `req.userSessionError` 返回 503。
|
||||
- 对 public plaza read 继续放行。
|
||||
- 捕获后续 `getMe()` 异常并返回 503。
|
||||
|
||||
测试:
|
||||
|
||||
- `node --check server.mjs` 通过。
|
||||
- `node --test auth.test.mjs user-auth.test.mjs admin-guard.test.mjs` 通过,23 tests pass。
|
||||
|
||||
生产部署:
|
||||
|
||||
- 备份:
|
||||
- `/Users/john/Project/memind_backups/20260702-121438-p82-auth-transient-hardening`
|
||||
- 已部署:
|
||||
- bundled `server.mjs`
|
||||
- 已重启:
|
||||
- `cn.tkmind.memind-portal`
|
||||
|
||||
生产验证:
|
||||
|
||||
- `https://mm.tkmind.cn/api/status` 返回 `ok`。
|
||||
- `https://mm.tkmind.cn/auth/status` 未登录返回 `200 {"authenticated":false,"mode":"user"}`。
|
||||
- `/api/runtime/status.toolRuntime`:
|
||||
- `codeRunsEnabled=true`
|
||||
- `requireValidation=true`
|
||||
- `maxConcurrentRuns=2`
|
||||
- `oldestRunningStartedAt=null`
|
||||
- `oldestRunningAgeMs=0`
|
||||
- worker LaunchAgent running:
|
||||
- `--limit 2`
|
||||
- `MEMIND_TOOL_GATEWAY_ENABLED=1`
|
||||
- `MEMIND_AGENT_RUN_QUEUE_CONCURRENCY=2`
|
||||
- guard dry-run:
|
||||
- `ok=true`
|
||||
- `shouldPause=false`
|
||||
- SLO:
|
||||
- `ok=true`
|
||||
- `failures=[]`
|
||||
|
||||
## 回滚策略
|
||||
|
||||
- P0: 修改前保留 `server.mjs` 备份;如启动失败,恢复备份并 `launchctl kickstart` Portal。
|
||||
|
||||
Reference in New Issue
Block a user