21 lines
1.8 KiB
Markdown
21 lines
1.8 KiB
Markdown
# 会话策略与 Cookie 续期
|
||
|
||
用户确认的策略:30 天无活动过期,正常鉴权时续期,最长签发后 90 天重新登录。继续使用随机、可撤销的服务端会话令牌,不改用 JWT。
|
||
|
||
## Core
|
||
|
||
工作分支 `codex/session-lifetime`,提交 `34c461a`,PR #10 已合并;与纯图片改动一同进入主线 7847167,[部署 #889](https://gitea.entroia.com/Zayden-Jung/foundry-core/actions/runs/889) 已成功。新会话执行 30 天闲置 / 90 天绝对期限;既有过期会话不复活,有效会话可在下次鉴权时续期。
|
||
|
||
- 新会话 expires_in=2592000。
|
||
- 004-session-lifetime.sql 增加 created_at / absolute_expires_at。旧会话保留原 expires_at,不复活已过期会话;旧记录的 90 天上限从迁移时间起算。
|
||
- 鉴权原子更新 expires_at=min(当前时间+30天, absolute_expires_at)。闲置过期、绝对过期、撤销和跨项目令牌均不可续期。
|
||
- 成功鉴权后返回 `X-Foundry-Session-Expires-In`,值为按绝对期限截断后的剩余秒数。平台接口与 auth/me 均支持该头。
|
||
|
||
## 前端
|
||
|
||
同源代理从 HttpOnly Cookie 取令牌转发给 Core;不把令牌返回客户端 JavaScript。登录时按照 expires_in 设置 Cookie,普通已认证响应按照续期头更新 Cookie,最多 30 天。临近 90 天时按 Core 返回的剩余秒数缩短 Cookie;401 或非法续期头不续期。
|
||
|
||
Cookie 保留 HttpOnly、SameSite=Lax、Path=/;生产 HTTPS 使用 Secure。旧 Core 未返回续期头时保持兼容,不自行假定令牌有效期已经延长。
|
||
|
||
验证覆盖:Cookie 上限及剩余时间、非法头、401 不续期、退出清除;Core CI 覆盖真实隔离数据库中的闲置/绝对过期、并发、撤销、项目隔离、OAuth 发放与旧会话迁移。
|