Python怎么做身份验证_JWT Token生成机制与后端接口校验全流程

夜枫酱_1572

夜枫酱_1572

2026-03-26

230人浏览

原创

jwt生成必须显式指定algorithm(如hs256),禁用none算法;密钥须从环境变量读取;payload勿含敏感信息,设exp过期时间;校验需区分expiredsignatureerror、invalidsignatureerror、decodeerror;authorization头格式须为“bearer ”;刷新token需双token机制+服务端状态管理。

python怎么做身份验证_jwt token生成机制与后端接口校验全流程

JWT生成时pyjwt的encode()必须传algorithm参数

不指定algorithm会导致默认用none算法(即无签名),Token可被任意篡改,后端校验形同虚设。这是新手最常踩的坑,错误示例:jwt.encode(payload, secret)在新版PyJWT(2.0+)中会直接报TypeError: encode() missing 1 required argument: 'algorithm'。

正确做法是显式声明签名算法:

  • algorithm='HS256'最常用,适合对称密钥场景
  • 密钥secret不能硬编码在代码里,应从环境变量读取,如os.getenv('JWT_SECRET_KEY')
  • payload中避免放敏感字段(如密码、身份证号),sub建议用用户ID而非用户名,防止重名或变更导致Token失效
  • 务必设置exp(过期时间),否则Token永不过期;推荐用datetime.utcnow() + timedelta(hours=24)生成exp值

Django/Flask里校验JWT要捕获ExpiredSignatureError和InvalidTokenError

只用try/except Exception会掩盖具体问题,导致调试困难。真实请求中常见错误不是“Token错”,而是“过期了”或“签名不匹配”,这两类必须分开处理。

以PyJWT为例,校验逻辑应明确区分:

  • ExpiredSignatureError:返回401 Unauthorized + {"error": "token expired"}
  • InvalidSignatureError:可能是密钥不一致或Token被篡改,按非法请求处理(401但不暴露原因)
  • DecodeError:Token格式错误(比如base64缺位),通常是前端传参异常,返回400 Bad Request
  • 别忘了检查payload.get('exp')是否为数值类型——某些手动构造的Token可能把exp写成字符串,pyjwt不会自动转换

前端传Token时Header字段名必须是Authorization: Bearer <token></token>

后端框架(如Django REST Framework的JWTAuthentication、Flask-JWT-Extended)默认只认这个格式。写成Token xxx、Bearerxxx(少空格)、authorization(小写)都会失败,且错误提示往往模糊,比如Authentication credentials were not provided.。

python学习
python学习

Python 编程学习助手 skill,面向零基础用户。 当用户表达以下意图时触发: - 学习 Python 基础概念(变量、数据类型、循环、函数、类等) - 请求 Python 练习题或测验 - 请求审查或调试 Python 代码 - 请求 Python 项目实战指导(爬虫、数据分析、Web 开发等入门项目) - 泛化表述如"教我 Python""我想学编程""Python 怎么写""帮我学 Python" 此 skill

下载

实操注意点:

  • axios请求需显式设置:headers: { Authorization: `Bearer ${token}` }
  • fetch中不要漏掉Bearerspace,写成`Bearer${token}`会导致401
  • 如果用Nginx反向代理,确认没过滤Authorization头(需配置proxy_set_header Authorization $http_authorization;)
  • 移动端WebView或旧版iOS Safari可能截断长Token,建议限制payload大小,避免塞太多字段

刷新Token不能只靠延长exp,得用独立refresh_token机制

单纯在每次请求时用原密钥重新签发一个新access_token,等于没解决安全问题——只要access_token泄露,攻击者就能无限续期。真正的刷新逻辑需要双Token配合。

关键设计点:

  • access_token短时效(如15分钟),只用于API调用,不存数据库
  • refresh_token长时效(如7天),带jti唯一标识,服务端需存入Redis并绑定用户ID和设备指纹
  • 刷新接口(如POST /auth/refresh)必须验证refresh_token有效性,并在成功后立即让原refresh_token失效(Redis DEL)
  • 别把refresh_token存在localStorage——XSS可直接盗取;应设为httpOnly Cookie(且SameSite=Strict)

Token本身是自包含凭证,但“刷新”这件事必须依赖服务端状态管理。漏掉失效机制,等于给攻击者开了永久后门。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2603

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6650

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6066

10

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1791

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4684

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1749

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

27817

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3347

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3367

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习