jwt生成必须显式指定algorithm(如hs256),禁用none算法;密钥须从环境变量读取;payload勿含敏感信息,设exp过期时间;校验需区分expiredsignatureerror、invalidsignatureerror、decodeerror;authorization头格式须为“bearer ”;刷新token需双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.。
实操注意点:
- 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失效(RedisDEL) - 别把
refresh_token存在localStorage——XSS可直接盗取;应设为httpOnlyCookie(且SameSite=Strict)
Token本身是自包含凭证,但“刷新”这件事必须依赖服务端状态管理。漏掉失效机制,等于给攻击者开了永久后门。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











