djangorestframework-simplejwt 是 Django REST Framework 中 JWT 认证的唯一推荐方案,需正确安装配置、路由分离、自定义序列化器及生产调优。
djangorestframework-simplejwt 是当前 Django REST Framework 中 JWT 认证的事实标准,djangorestframework-jwt 已停止维护(最后更新于 2019 年),强行使用会导致签名验证失败、AttributeError: 'Settings' object has no attribute 'JWT_AUTH' 等错误,且不兼容 Django 4.2+ 和 Python 3.11+。
直接用 djangorestframework-simplejwt,别绕路。
安装与基础配置必须一步到位
只装一个包,别混用旧库:
pip install djangorestframework-simplejwt
在 settings.py 中确认三件事:
-
rest_framework和rest_framework_simplejwt都在INSTALLED_APPS里(后者非必须但推荐) -
DEFAULT_AUTHENTICATION_CLASSES中只保留'rest_framework_simplejwt.authentication.JWTAuthentication',删掉所有JSONWebTokenAuthentication或其他 JWT 类 - 不用手动设
SECRET_KEY给 JWT —— 它自动复用 Django 的SECRET_KEY,改它就等于改 JWT 签名密钥
路由必须配对且路径清晰
TokenObtainPairView 返回 access + refresh 两个令牌;TokenRefreshView 只接受 refresh 令牌换新 access。二者缺一不可,且不能共用同一 URL:
-
/api/token/→ POST 用户名密码,返回{"access":"xxx","refresh":"yyy"} -
/api/token/refresh/→ POST{"refresh":"yyy"},返回新{"access":"zzz"} - 别把
refresh放在 Authorization 头里 —— 它只认请求体里的refresh字段 - 别漏掉 trailing slash:Django URL 路由严格匹配,
/api/token/refresh(无斜杠)会 404
自定义 payload 要重写序列化器,不是改 settings
想往 token 里塞 user.username 或 user.is_staff?不能靠 SIMPLE_JWT 配置项硬加,必须继承 TokenObtainPairSerializer:
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['username'] = user.username
token['is_admin'] = user.is_staff
return token
再绑定到视图:
立即学习“Python免费学习笔记(深入)”;
from rest_framework_simplejwt.views import TokenObtainPairView
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
然后把 URL 指向这个新视图,而不是原生的 TokenObtainPairView。
生产环境必须调优 SIMPLE_JWT 配置
默认 ACCESS_TOKEN_LIFETIME 是 5 分钟,REFRESH_TOKEN_LIFETIME 是 1 天 —— 这不够用也不安全:
- 短 access 令牌(如 15 分钟)+ 长 refresh 令牌(如 7 天)是常见平衡点
- 启用
ROTATE_REFRESH_TOKENS: True后,每次刷新都会作废旧 refresh,防止泄露滥用 - 搭配
BLACKLIST_AFTER_ROTATION: True才生效,否则黑名单无效 -
ALGORITHM别乱改,默认HS256足够,除非你有硬件级密钥管理需求
真正容易被忽略的是 refresh 令牌的存储和传输方式:它比 access 更敏感,不该存在 localStorage;HTTP-only cookie 是更稳妥的选择,但这需要额外前端适配和 CSRF 防护配合 —— 单纯靠 JWT 库解决不了。


















