JWT生成必须显式指定algorithm(如HS256),禁用none算法;密钥须从环境变量读取;payload勿含敏感信息,设exp过期时间;校验需区分ExpiredSignatureError、InvalidSignatureError、DecodeError;Authorization头格式须为“Bearer ”;刷新Token需双Token机制+服务端状态管理。
JWT生成时
的
必须传
参数
不指定
会导致默认用
算法(即无签名),Token可被任意篡改,后端校验形同虚设。这是新手最常踩的坑,错误示例:
在新版
(2.0+)中会直接报
。
正确做法是显式声明签名算法:
最常用,适合对称密钥场景
密钥
不能硬编码在代码里,应从环境变量读取,如
payload中避免放敏感字段(如密码、身份证号),
建议用用户ID而非用户名,防止重名或变更导致Token失效
务必设置
(过期时间),否则Token永不过期;推荐用
生成
值
Django/Flask里校验JWT要捕获
和
只用
会掩盖具体问题,导致调试困难。真实请求中常见错误不是“Token错”,而是“过期了”或“签名不匹配”,这两类必须分开处理。
以
为例,校验逻辑应明确区分:
立即学习
“
Python免费学习笔记(深入)
”;
:返回
+
:可能是密钥不一致或Token被篡改,按非法请求处理(
但不暴露原因)
:Token格式错误(比如base64缺位),通常是前端传参异常,返回
别忘了检查
是否为数值类型——某些手动构造的Token可能把
写成字符串,
不会自动转换
前端传Token时Header字段名必须是
后端框架(如Django REST Framework的
、Flask-JWT-Extended)默认只认这个格式。写成
、
(少空格)、
(小写)都会失败,且错误提示往往模糊,比如
。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
实操注意点:
axios请求需显式设置:
fetch中不要漏掉
,写成
会导致401
如果用Nginx反向代理,确认没过滤
头(需配置
)
移动端WebView或旧版iOS Safari可能截断长Token,建议限制
大小,避免塞太多字段
刷新Token不能只靠延长
,得用独立
机制
单纯在每次请求时用原密钥重新签发一个新
,等于没解决安全问题——只要
泄露,攻击者就能无限续期。真正的刷新逻辑需要双Token配合。
关键设计点:
短时效(如15分钟),只用于API调用,不存数据库
长时效(如7天),带
唯一标识,服务端需存入Redis并绑定用户ID和设备指纹
刷新接口(如
)必须验证
有效性,并在成功后立即让原
失效(Redis
)
别把
存在localStorage——XSS可直接盗取;应设为
Cookie(且
)
Token本身是自包含凭证,但“刷新”这件事必须依赖服务端状态管理。漏掉失效机制,等于给攻击者开了永久后门。
pyjwtencode()algorithmalgorithmnonejwt.encode(payload, secret)PyJWTTypeError: encode() missing 1 required argument: 'algorithm'algorithm='HS256'secretos.getenv('JWT_SECRET_KEY')subexpdatetime.utcnow() + timedelta(hours=24)expExpiredSignatureErrorInvalidTokenErrortry/except ExceptionPyJWTExpiredSignatureError401 Unauthorized{"error": "token expired"}InvalidSignatureError401DecodeError400 Bad Requestpayload.get('exp')exppyjwtAuthorization: Bearer JWTAuthenticationToken xxxBearerxxxauthorizationAuthentication credentials were not provided.headers: { Authorization: `Bearer ${token}` }Bearerspace`Bearer${token}`Authorizationproxy_set_header Authorization $http_authorization;payloadexprefresh_tokenaccess_tokenaccess_tokenaccess_tokenrefresh_tokenjtiPOST /auth/refreshrefresh_tokenrefresh_tokenDELrefresh_tokenhttpOnlySameSite=Strict