Laravel多用户JWT自动续期需隔离token来源、采用双token机制并严格校验上下文:各模型在getJWTCustomClaims()中注入type标识,refresh接口按type路由guard,refresh_token存Redis并绑定type与user_id,中间件静默续期且每次刷新后失效旧token。

在 Laravel 中使用 JWT 实现多用户(如 Admin、User、Merchant 等不同模型)时,token 过期自动续期不能只依赖默认的单表逻辑——否则会出现越权问题(比如用户 token 可访问管理后台),且原生 tymon/jwt-auth 不自动支持多模型隔离续期。核心解法是:**区分 token 来源 + 双 token 机制 + 按用户类型隔离存储 + 续期时严格校验上下文**。
多用户 token 隔离:必须加自定义 claim
默认 JWT 的 sub 字段只存 ID,无法区分是哪个模型的用户。必须在签发时写入模型标识:
- 在各用户模型(如
App\Models\Admin)中重写getJWTCustomClaims():
{
return [
'type' => 'admin', // 或 'user', 'merchant'
'model' => self::class,
];
}
- 续期接口(如
/api/token/refresh)收到请求后,先解析原始 token 的type声明,再决定调用哪个 guard(如auth:admin或auth:api)进行验证和刷新; - 拒绝处理
type与当前请求路由不匹配的 token(例如管理端接口只接受type=“admin”的 token)。
安全续期流程:refresh token + 后端状态校验
不推荐纯前端定时刷新或无状态自动延长(违背 JWT 安全原则)。应采用带服务端状态的 refresh token 方案:
大模型 Token 成本节约工具。在请求到达大模型之前自动压缩 prompt 和上下文,减少 60-95% 的 token 消耗,直接降低 API 成本。支持 Claude/OpenAI/Gemini 等主流模型,提供代理模式、CLI 包装、Python SDK 和 MCP Server 四种接入方式。内置一键安...
- 登录成功时,除返回
access_token(15–30 分钟),还生成一个长期有效的refresh_token(7 天),存入 Redis,key 为refresh:{type}:{user_id},value 为加密后的随机字符串; -
access_token过期后,前端携带它和refresh_token请求/api/token/refresh; - 后端验证:
✓refresh_token是否存在于 Redis 且未被撤销
✓ 原access_token的type和用户 ID 是否与refresh_token记录一致
✓ 用户当前是否仍处于激活/未禁用状态; - 全部通过才签发新
access_token,并更新refresh_token的 Redis 过期时间(滚动刷新)。
拦截器中实现无感续期(对前端透明)
在自定义中间件(如 EnsureTokenValid)中,当捕获 TokenExpiredException 时,不直接返回 401,而是尝试静默续期:
- 从请求头取出
Authorization: Bearer xxx和可选的X-Refresh-Token; - 若含有效
refresh_token且签名、类型、用户状态均合法,则生成新access_token; - 将新 token 放入响应头
X-Access-Token,并设置Refresh-Token响应头(可选); - 继续执行后续逻辑(无需中断请求)——前端收到新 token 后可自动覆盖本地存储。
防滥用关键细节
避免 refresh token 泄露后被长期利用:
- 每次成功刷新后,立即 失效旧 refresh token(Redis
DEL),并生成新值; - 记录每个用户的 refresh token 使用次数和最近 IP/UA,异常频次触发风控(如锁定该用户 refresh 能力 1 小时);
- 敏感操作(如修改密码、绑定手机)强制要求重新登录,不走 refresh 流程;
- 所有 refresh 接口启用频率限制(如 5 次/小时/用户),防止暴力探测。










