怎样在ThinkPHP中实现用户会话Token自动续期【安全】
Token续期这事儿,必须在每次合法请求时触发,绝对不能依赖前端定时刷新或者PHP原生session自动延长——否则,等到用户正操作到一半,突然被踢下线,体验就很糟糕了。核心操作其实很简单:在认证中间件里校验通过后,动态生成新的JWT,更新Redis中的token状态,然后删除旧键。同时,通过响应头
Token续期这事儿,必须在每次合法请求时触发,绝对不能依赖前端定时刷新或者PHP原生session自动延长——否则,等到用户正操作到一半,突然被踢下线,体验就很糟糕了。核心操作其实很简单:在认证中间件里校验通过后,动态生成新的JWT,更新Redis中的token状态,然后删除旧键。同时,通过响应头X-Auth-Token把新token推送给前端,供它更新本地存储。

每次合法请求触发续期,不是靠前端定时刷新
ThinkPHP的session_start()默认不会自动延长会话有效期,如果单纯依赖PHP原生session机制,Token过期后用户就会突然登出。安全续期的核心逻辑是:只要用户本次请求通过身份校验(比如JWT解析成功,或者数据库token匹配有效),就生成新Token并更新过期时间,同时让旧Token失效——这样能有效防止重放攻击。
- 不要在中间件里无条件调用
Session::set(),或者写死ini_set('session.gc_maxlifetime', ...)——这会让所有会话都延长,破坏时效性控制 - 建议把续期逻辑放在登录态校验中间件中,并且只对非登录接口(比如
/api/user/profile)生效;登录接口本身不续期,避免循环刷新 - 如果使用JWT,
exp字段必须每次动态计算(比如time() + 3600),不能复用原始payload
用Redis存储Token,设置滑动过期时间
PHP原生file session不太适合Token续期场景:它做不到原子性地“读旧值 → 判有效性 → 写新值 → 删旧值”。Redis是更稳妥的选择,配合SETEX和DEL操作,可以精确控制生命周期。
- Token键名建议设计为
token:{user_id}:{device_fingerprint},这样即使同一账号多端登录,也不会因为互踢而误删 - 续期时,先用
GET检查原Token是否存在,并且没有被标记为失效(可以用哈希字段status标记invalid) - 新Token写入时,用
SETEX token:{new_id} 7200 {jwt_string},7200秒是滑动窗口的上限,实际每次续期都会重置TTL - 写入新Token后,必须立即
DEL旧键,否则存在短暂的双Token窗口,增加重放风险
ThinkPHP中间件里安全执行续期
在app/middleware/CheckAuth.php中,完成校验后插入续期动作,而不是放到控制器里做——否则容易遗漏,或者重复执行。
- 从请求头取
Authorization,提取Bearer后面的token字符串,用JWT::parse($token)验签,并检查exp和nbf - 验证通过后,调用自定义方法
$this->renewToken($userId, $deviceFp),这个方法生成新JWT、存入Redis,最后返回新token字符串 - 用
Response::header('X-Auth-Token', $newToken)把新Token推送到响应头,前端需要监听这个header,并覆盖本地存储 - 禁止直接修改
$_SESSION或调用Session::id()——ThinkPHP的Session封装与Token续期无关,混用会导致状态混乱
前端必须配合处理响应头中的新Token
很多团队只改了后端,结果续期形同虚设:前端仍发送旧Token,服务端虽然生成了新Token,却没人接收。这是个双向奔赴的事情。
- Axios全局响应拦截器里,检查
response.headers['x-auth-token'],存在就更新本地localStorage.setItem('token', ...) - 注意:如果前端用
credentials: 'include'发送Cookie,而服务端又同时写入Session,会造成认证凭据冗余甚至冲突,建议统一走Header Token - 首次请求没有
X-Auth-Token头是正常的;但如果连续两次请求都没收到新头,就要排查中间件是否跳过了续期逻辑(比如游客路由没进CheckAuth)
滑动过期真正起效的前提,是前后端对Token生命周期的理解一致——后端不主动踢人,前端不缓存过期值,Redis键的TTL才有意义。任何一环断开,所谓的“自动续期”就只是个后台日志里的空转操作。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















