0

0

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

蓮花仙者

蓮花仙者

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

|

581人浏览过

|

来源于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_tokenexpires_in、新refresh_token(可选)和refresh_expires_in

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

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

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

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

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

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

Tweeze
Tweeze

Tweeze.app是一个AI驱动的个性化新闻简报服务,定位为个人互联网AI阅读助手

下载

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

  • 前端应在原请求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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

184

2024.05.11

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

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

226

2025.12.18

ajax教程
ajax教程

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

166

2023.06.14

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

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

170

2023.08.31

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

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

124

2023.11.15

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

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

260

2024.09.24

登录token无效
登录token无效

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

6659

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

845

2023.09.14

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号