5.2 KiB
5.2 KiB
platform-auth refresh cookie 适配设计
日期:2026-04-21
1. 文档目的
这份文档用于指导 M2 中“实现 refresh cookie 读取”这条任务落地,目标是先把 refresh cookie 的读取边界、配置口径与 api-server 的最小接线固定下来。
本阶段只解决:
platform-auth如何统一读取 refresh cookie。api-server如何把读取结果挂到请求上下文。
本阶段不解决:
- refresh token 轮换。
- refresh session 吊销。
- refresh cookie 写回浏览器。
2. 设计输入
本任务直接受以下文档约束:
- SPACETIMEDB_REFRESH_SESSION_TABLE_DESIGN_2026-04-21.md
- SPACETIMEDB_AXUM_OSS_BACKEND_REWRITE_DESIGN_2026-04-20.md
关键冻结点:
- 浏览器 cookie 只存原始 refresh token。
- 服务端真相表只存
sha256(refresh_token)。 - cookie 名默认是
genarrative_refresh_session。 - cookie
Path默认是/api/auth。 - 默认
SameSite=Lax。
3. crate 边界
3.1 platform-auth
负责:
- 统一 refresh cookie 配置结构。
- 统一 cookie 名、Path、SameSite、Secure、TTL 的平台配置。
- 从
Cookie请求头解析当前 refresh token。
不负责:
- 直接操作
Set-Cookie响应头。 - 决定请求是否应该被视为已登录。
- 访问
refresh_session真相表。
3.2 api-server
负责:
- 从环境变量读取 refresh cookie 配置。
- 在启动时构造唯一一份
RefreshCookieConfig。 - 在请求链中读取 refresh cookie 并挂到 request extensions。
- 为阶段验收提供最小内部调试入口。
不负责:
- 重写一套独立 cookie 解析逻辑。
- 在这一步直接实现
/api/auth/refresh。
4. 配置口径
当前阶段 api-server 读取以下环境变量:
| 配置项 | 环境变量 | 默认值 | 说明 |
|---|---|---|---|
| cookie 名 | AUTH_REFRESH_COOKIE_NAME |
genarrative_refresh_session |
读取 refresh cookie 时匹配的键名。 |
| cookie path | AUTH_REFRESH_COOKIE_PATH |
/api/auth |
当前阶段只用于冻结配置口径。 |
| cookie secure | AUTH_REFRESH_COOKIE_SECURE |
false |
当前阶段只读配置,不在读取路径参与判断。 |
| cookie same-site | AUTH_REFRESH_COOKIE_SAME_SITE |
Lax |
固定枚举为 Lax、Strict、None。 |
| session TTL 天数 | AUTH_REFRESH_SESSION_TTL_DAYS |
30 |
当前阶段只读配置,不参与读取判断。 |
说明:
- 这组变量直接对齐当前 Node 口径。
- 本阶段读取链路只真正依赖
cookie_name,其余配置主要用于冻结统一初始化边界。
5. Rust 结构设计
5.1 RefreshCookieSameSite
用途:
- 避免不同 crate 手写
Lax/Strict/None字符串。 - 在启动阶段尽早拒绝非法配置。
5.2 RefreshCookieConfig
字段:
cookie_namecookie_pathcookie_securecookie_same_siterefresh_session_ttl_days
约束:
cookie_name不能为空。cookie_path不能为空。refresh_session_ttl_days必须大于0。
6. 读取规则
read_refresh_session_token(cookie_header, config) 固定按以下规则工作:
- 若
Cookie头为空,返回None。 - 按
;分割各 cookie 项。 - 只匹配与
config.cookie_name完全相等的键名。 - 若匹配项值为空,返回
None。 - 对匹配值执行 URL decode。
- decode 成功则返回原始 refresh token,失败则返回
None。
说明:
- 当前阶段读取逻辑只做“解析”,不做权限判断。
- 请求是否能继续 refresh,要在后续应用层结合
refresh_session真相表判断。
7. api-server 最小接线
本阶段 api-server 只做三件事:
AppConfig增加 refresh cookie 配置。AppState启动时构造RefreshCookieConfig。attach_refresh_session_token中间件从请求头读取 cookie,并把结果以RefreshSessionToken写入 request extensions。
阶段验收入口:
/_internal/auth/refresh-cookie
该入口仅返回:
cookieNamepresenttokenLength
说明:
- 当前不回显原始 refresh token,避免把敏感值直接暴露到响应体中。
tokenLength只用于阶段测试与调试,不是最终对外 contract。
8. 测试策略
当前阶段至少覆盖:
- 纯函数能正确提取目标 cookie。
- URL 编码的 cookie 值能正确解码。
- 缺少目标 cookie 时返回空。
api-server在无 cookie 时能返回present = false。api-server在有 cookie 时能返回present = true。
9. 完成定义
满足以下条件时,本任务视为完成:
platform-auth中存在真实可编译的 refresh cookie 配置与读取逻辑。api-server已接入统一 refresh cookie 配置。- 请求链已能读取 cookie 并挂到 extensions。
- 编译与测试通过。
- 任务清单已同步更新。
10. 后续衔接
这条任务完成后,下一步继续衔接:
- refresh token 哈希与
refresh_session表查询。 - refresh token 轮换。
/api/auth/refresh正式接口。/api/auth/logout、/api/auth/logout-all的会话吊销。