0

0

Python WebAPI如何实现令牌自动刷新与校验中间件【教程】

冷炫風刃

冷炫風刃

发布时间:2025-12-12 22:45:07

|

957人浏览过

|

来源于php中文网

原创

令牌自动刷新的核心逻辑是:access_token过期后中间件捕获401,用有效的refresh_token换取新token并重放请求;需避免并发刷新、保证安全存储与及时作废。

python webapi如何实现令牌自动刷新与校验中间件【教程】

令牌自动刷新的核心逻辑

用户登录后获得的访问令牌(access_token)通常有较短有效期(如15分钟),而刷新令牌(refresh_token)有效期更长(如7天)。自动刷新不是“后台偷偷换token”,而是当请求携带的 access_token 过期时,中间件捕获 401 错误,用 refresh_token 向认证服务换新 access_token,并重放原始请求。

关键点:
- 不在每次请求都刷新,只在 access_token 确认过期且 refresh_token 有效时才触发
- 刷新过程对前端透明,前端仍按原方式发请求,中间件负责兜底重试
- 避免并发刷新:同一用户多个请求同时过期时,只允许一个线程去刷新,其余等待结果

FastAPI 中间件实现校验与刷新

用 FastAPI 的 BaseHTTPMiddleware 拦截请求,在请求头中提取 Authorization Bearer token,解析并校验 JWT:

  • PyJWT 验签 + 检查 exp 字段,捕获 ExpiredSignatureError
  • 若过期,从请求上下文或 Redis 中取出该用户的 refresh_token(需提前绑定 user_id 和 refresh_token)
  • 调用内部 /auth/refresh 接口(或直接解密 refresh_token,若它也是 JWT 且服务端可验签)
  • 成功获取新 access_token 后,替换响应头中的 Authorization,或返回 401 + 新 token 供前端更新本地存储

注意:不要在中间件里直接修改 request.state —— 它是只读的;刷新结果建议通过 Response.headers 或自定义 JSON 响应体透出。

避免重复刷新与状态同步

多个请求几乎同时到达,都发现 token 过期,会引发多次刷新请求,浪费资源甚至导致 refresh_token 被单次使用后失效(若策略为“用完即焚”):

GradPen论文
GradPen论文

GradPen是一款AI论文智能助手,深度融合DeepSeek,为您的学术之路保驾护航,祝您写作顺利!

下载

立即学习Python免费学习笔记(深入)”;

  • 用内存字典或 Redis 的 SETNX + 过期时间模拟锁:key 为 user_id,value 为 promise 或 task id
  • 首个请求加锁、发起刷新;后续请求检查锁存在则等待(可用 asyncio.wait_for + 共享 future)
  • 刷新完成后主动广播新 token,或让等待方轮询一次结果(推荐前者,更实时)
  • 前端也需配合:收到 401 且响应含 new_access_token 时,自动更新 localStorage 并重试原请求

安全与生产注意事项

自动刷新不是银弹,必须搭配合理安全策略:

  • refresh_token 必须 HttpOnly + Secure + SameSite=Strict 存储在 Cookie 中,禁止 JS 访问
  • 每次使用 refresh_token 后,立即作废旧 token(服务端记录黑名单或滚动更新)
  • 限制 refresh_token 使用频次(如 1 小时内最多刷新 3 次),防暴力试探
  • access_token 尽量精简载荷(不存敏感字段),校验时只依赖签名校验和标准字段(exp, iat, iss)
  • 日志中脱敏处理 token 字符串,避免泄露到错误日志

基本上就这些。不复杂但容易忽略细节,尤其是锁机制和前后端协同时机。写好中间件后,真正的业务路由完全不用感知 token 刷新过程。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

178

2024.05.11

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

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

214

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

27

2025.12.22

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6427

2023.06.30

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

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

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