docs: import wiki at afc651f75a3a

ila
2026-08-07 16:37:08 +08:00
parent 6028692a2c
commit f1e49ab906
+80
@@ -0,0 +1,80 @@
<!-- docs-wiki-sync:docs/tasks/T-267.md@afc651f75a3abc2676bb13aa8a80f6aa6a25a72e -->
> 同步来源:[`docs/tasks/T-267.md`](/chengma/mroubao/src/commit/afc651f75a3abc2676bb13aa8a80f6aa6a25a72e/docs/tasks/T-267.md) · commit `afc651f75a3a`
---
id: T-267
title: 将管理 Web Session 固定有效期延长为30天
phase: 2
deps:
- T-204
- T-266
status: DONE
created: 2026-08-01
context_ref: 9409b97
work_branch: null
write_paths:
- docs/tasks/T-267.md
- docs/current-state.md
- docs/02-requirements.md
- docs/03-tech-stack.md
- docs/04-architecture.md
- docs/api.md
- backend-api/README.md
- backend-api/internal/usecase/**
- backend-api/internal/transport/webui/**
---
## 问题 / 背景
管理后台当前每次登录创建固定8小时 ADMIN 服务端 session。内部采购管理人员需要减少
重复登录,将网页登录有效期改为1个月。
Go `time.Duration` 不表达自然月,本任务把“1个月”固定定义为 **30天,即720小时、
2,592,000秒**,与 T-266 的设备 token 期限表达一致,但两类凭证继续完全隔离。
## 行为契约
- 新创建 ADMIN Web Session 的绝对有效期固定为 `30 * 24 * time.Hour`。
- 登录成功时,服务端 session 的 `expires_at`、浏览器 Cookie 的 `Expires` 和 `Max-Age`
必须采用同一个到期时间;`Max-Age` 约为 `2592000` 秒,只允许请求执行耗时造成的秒级差异。
- 已有 session 保留数据库中的原 `expires_at`,不批量延长;部署后管理员需重新登录一次
才能取得30天 session。
- session 不因浏览页面、提交表单或 API 请求滚动续期,不增加 refresh session。
- 退出登录、账号禁用、session 撤销和绝对到期仍在下一次请求立即生效。
## 不变边界
- BUYER 设备 Bearer token 继续使用 T-266 定义的固定30天有效期,两类凭证不可互换。
- 管理 Cookie 继续使用 `HttpOnly`、TLS 下 `Secure` 和 `SameSite=Lax`。
- CSRF Cookie 的独立1小时 `Max-Age` 不变;CSRF token 可按既有流程轮换,不影响登录 session。
- 设备 secret、任务 claim token、claim 租约、execution 授权和幂等 key 生命周期均不变。
- 不增加数据库迁移或可配置环境变量。
## 方案
1. 将 `AdminSessionLifetime` 改为 `30 * 24 * time.Hour`。
2. 增加固定期限测试,避免实现常量与测试期望同时漂移。
3. 增加 Web 登录 Cookie 测试,核对 `Expires` 和 `Max-Age` 与服务端到期时间一致。
4. 同步需求、技术栈、架构、API、后端说明和当前状态文档。
5. 运行 Go 全量测试和根 `init.ps1`。
## 验收要点
- [x] 新登录产生的 `expires_at - created_at` 严格等于30天。
- [x] 登录 Cookie 的 `Expires` 与服务端到期时间一致,`Max-Age` 接近 `2592000` 秒。
- [x] 已有 session 不被迁移或静默延期。
- [x] 过期、撤销、退出和用户禁用测试继续通过。
- [x] BUYER token、CSRF Cookie 和任务相关生命周期无改动。
- [x] Go 全量测试和根 `init.ps1` 通过。
## 执行记录
- 2026-08-01:建立任务契约,明确30天为固定绝对期限,既有 session 不迁移,管理
Session 与 BUYER Bearer token、CSRF Cookie 继续隔离。
- 2026-08-01:将 `AdminSessionLifetime` 从8小时改为 `30 * 24 * time.Hour`;新创建
Session 的数据库 `expires_at` 固定为30天后,既有记录不更新。
- 2026-08-01:Web 登录测试核对 Cookie `Expires` 与服务端结果一致,`Max-Age` 在
`2592000` 秒的请求耗时容差内;CSRF Cookie 的独立1小时配置未修改。
- 2026-08-01:`go test ./internal/usecase ./internal/transport/webui`、`go test ./...`
和根 `init.ps1` 全部通过;根检查覆盖 Android Debug/Release 单测、Debug APK、共享
契约、导入工具和 Go 后端全量测试。