讲师中心 微信公众号
AI工具推荐 视频效率加速

Yii框架的JWT刷新机制_无感刷新access_token实现【方法】

云涛君_7828

云涛君_7828

发布时间:2026-03-16 09:11:03

|

681人浏览过

|

来源于php中文网

原创

核心是用户操作时access_token过期但refresh_token有效,后端需提供独立刷新接口,严格校验refresh_token签名、绑定关系及一次性使用,并作废旧token、返回新token;Yii中应禁用CompositeAuth和CSRF,手动解析refresh_token,Redis存储需设TTL并主动清理,业务逻辑须幂等。

yii框架的jwt刷新机制_无感刷新access_token实现【方法】

JWT刷新时access_token过期但refresh_token仍有效,怎么续签不跳登录页

无感刷新的核心是:用户操作时发现access_token已过期(比如接口返回401 Unauthorized),但refresh_token还没过期,就该自动用它换新access_token,再重发原请求。Yii里不能靠前端自己埋逻辑兜底——后端得暴露标准刷新接口,且要严格校验refresh_token签名、绑定关系和使用次数。

常见错误现象:refresh_token被重复使用(没做一次性校验)、没验证它和原access_token是否同属一个用户+设备、刷新后没更新refresh_token本身(导致旧token还能继续刷)。

  • Yii中建议把刷新逻辑抽成独立Action,例如SiteController::actionRefreshToken(),不要塞在登录Action里
  • refresh_token必须存服务端(如Redis),带过期时间+用户ID+设备指纹哈希,不能只存在客户端
  • 刷新成功后,务必作废当前refresh_token,并生成新的refresh_token返回(避免“一刷永刷”)
  • 响应体至少返回access_token、expires_in、新refresh_token(可选)和refresh_expires_in

Yii2中用yii\filters\auth\CompositeAuth实现双token校验失败的典型原因

很多人想让access_token走HttpBearerAuth,refresh_token走QueryParamAuth,结果发现CompositeAuth只认第一个通过的认证方式,根本不会进第二个——它不是“或”逻辑,而是“短路匹配”。所以不能指望它自动区分两种token类型。

正确做法是:把刷新接口单独剥离,不用CompositeAuth,改用自定义行为(yii\base\ActionFilter)或直接在Action里手动解析refresh_token参数(如POST /auth/refresh带refresh_token=xxx)。

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载
  • 别在刷新接口上挂CompositeAuth,否则access_token校验失败就会直接返回401,根本进不到刷新逻辑
  • 刷新接口必须关闭CSRF(enableCsrfValidation = false),否则AJAX POST会因缺少_csrf报400
  • 校验refresh_token时,要用和生成时完全一致的密钥、算法、payload结构(比如是否含jti、iss等字段)
  • 注意时钟漂移:服务端验证exp时,建议预留几秒容差($jwt->setLeeway(5)),否则NTP不同步会导致频繁刷新失败

刷新后重放原请求时,Yii中如何避免重复提交或状态错乱

前端拿到新access_token后重试原请求,后端如果没做幂等防护,可能造成订单重复创建、积分重复发放等问题。Yii本身不提供请求重放的上下文透传机制,得靠约定和中间层处理。

关键点在于:刷新动作和原请求之间要有可追溯的关联,且原请求的业务逻辑必须支持“查重-跳过”或“事务回滚-重试”。

  • 前端应在原请求Header里带上唯一X-Request-ID(如UUID),刷新流程中透传该ID,日志和数据库写入时一并记录
  • 敏感操作(如支付、下单)接口内部应先查是否存在相同X-Request-ID的已完成记录,有则直接返回原结果,不执行业务逻辑
  • 不要在刷新Action里直接调用原Action方法——路径、参数、中间件执行状态都不可控;应提取业务逻辑为Service类,供登录、刷新、普通请求三处复用
  • 如果原请求是PUT/PATCH/DELETE,重放时需确保幂等性设计已落地,否则刷新机制反而放大并发风险

refresh_token存储在Redis里的过期策略和清理时机

把refresh_token当key存Redis最常见,但容易忽略两点:一是过期时间设太长(比如7天),导致用户登出后token仍有效;二是没配自动清理,长期运行后Redis内存涨满。

实际部署中,refresh_token的Redis TTL应该等于它的业务有效期(比如7天),但还要加一层主动失效机制——用户主动登出时,必须删掉对应key;同时后台跑定时任务,每天清理已过期但未被访问的key(Redis的EXPIRE是被动删除,不保证及时)。

  • key格式建议用refresh:{user_id}:{device_fingerprint_hash},避免单用户多设备冲突
  • 写入时用SET key value EX 604800(7天),别用SETEX——后者在Redis集群模式下可能不兼容
  • 登出接口必须同步执行DEL refresh:{user_id}*(配合SCAN+DEL,避免KEYS阻塞)
  • 如果用Yii缓存组件封装Redis,确认cache->set()传入的$duration单位是秒,且底层驱动支持TTL(如yii\redis\Cache)
事情说清了就结束。真正难的不是写刷新逻辑,而是让每个环节都守住边界:token不能跨设备复用、refresh_token不能无限续、重放请求不能绕过业务幂等。这些地方松一点,线上就容易出不可回溯的问题。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

669

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

624

2025.12.18

ThinkPHP中间件机制与请求拦截处理实践
ThinkPHP中间件机制与请求拦截处理实践

本专题围绕 ThinkPHP 中间件体系展开,深入讲解中间件的定义、注册与执行流程。内容包括全局中间件与路由中间件的区别、请求前后处理逻辑、自定义中间件开发以及权限验证与日志处理应用。通过实际案例,帮助开发者掌握中间件在项目中的核心作用与最佳实践。

438

2026.03.31

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

3020

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

360

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2833

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1161

2024.09.24

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

14066

2023.09.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

20

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn