在 Django Rest Framework 中开启 JWT 鉴权最推荐安装 djangorestframework-simplejwt 库,并在 settings.py 的 REST_FRAMEWORK 中配置认证类。过期时间通过 SIMPLE_JWT 字典中的 ACCESS_TOKEN_LIFETIME 和 REFRESH_TOKEN_LIFETIME 设置,单位需使用 datetime.timedelta。
先说结论:使用 djangorestframework-simplejwt 是社区标准方案,配置集中在 settings.py 且支持灵活的生命周期管理。
- 适合:新构建的 DRF 项目或需要无状态认证的场景。
- 先准备:安装 djangorestframework-simplejwt 包并确认 Python 环境兼容。
- 验收:使用过期 token 请求接口应返回 401 错误。
命令速用版
通过 pip 安装官方维护的 Simple JWT 库,这是目前 DRF 生态中最常用的 JWT 实现方案。
pip install djangorestframework-simplejwt为什么会这样
Django Rest Framework 原生不包含 JWT 认证功能,需要依赖第三方库扩展。
DRF 设计为模块化框架,默认提供 Session 和 Basic 认证,JWT 属于无状态认证方案,需额外引入。配置过期时间是为了平衡安全性与用户体验,access token 较短可减少泄露风险,refresh token 较长可避免用户频繁登录。公开资料中没有看到可靠的量化数据表明特定过期时长的安全收益,通常依据业务敏感度设定。
分步处理
按以下顺序修改配置文件和路由,确保认证后端和令牌获取接口同时生效。
第一步:修改 settings.py 认证配置
在 REST_FRAMEWORK 字典中添加 JWTAuthentication 类,确保全局或指定视图启用 JWT。
REST_FRAMEWORK = {\n 'DEFAULT_AUTHENTICATION_CLASSES': (\n 'rest_framework_simplejwt.authentication.JWTAuthentication',\n ),\n}第二步:配置令牌生命周期
在 settings.py 底部添加 SIMPLE_JWT 字典,使用 datetime.timedelta 设置时间跨度。
from datetime import timedelta\n\nSIMPLE_JWT = {\n 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),\n 'REFRESH_TOKEN_LIFETIME': timedelta(days=1),\n 'ROTATE_REFRESH_TOKENS': True,\n 'BLACKLIST_AFTER_ROTATION': True,\n}第三步:配置 urls.py 路由
引入官方提供的 Token 获取和刷新视图,暴露给前端调用。
from rest_framework_simplejwt.views import (\n TokenObtainPairView,\n TokenRefreshView,\n)\n\nurlpatterns = [\n path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),\n path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),\n]怎么验证是否生效
通过发送携带 Token 的请求和故意发送过期 Token 来验证鉴权逻辑。
验证成功:使用获取到的 access token 访问受保护接口,HTTP 状态码应为 200。
验证过期:等待 ACCESS_TOKEN_LIFETIME 设置的时间后再次请求,或使用旧 token,HTTP 状态码应为 401 Unauthorized。
检查日志:查看 Django 运行日志,确认没有 AuthenticationFailed 以外的异常报错。
常见坑
配置过程中容易忽略时区设置和令牌刷新机制,导致验证失败或安全漏洞。
- 时区不一致:服务器时间与客户端时间差异过大可能导致 token 立即失效,建议服务器统一使用 UTC 时间。
- 刷新逻辑:默认配置下 refresh token 使用后可能轮换,前端需处理新 refresh token 的存储,否则会导致用户被迫重新登录。
- 黑名单功能:Token 黑名单需要额外的数据库迁移支持,未执行 migrate 可能导致 Blacklist 相关功能报错。
常见问题
如何修改 Token 过期时间?
直接修改 settings.py 中 SIMPLE_JWT 字典下的 ACCESS_TOKEN_LIFETIME 值即可。
JWT 如何实现用户注销?
JWT 本身无状态无法强制失效,需开启 BLACKLIST_AFTER_ROTATION 并将 token 加入黑名单。
Access Token 和 Refresh Token 有什么区别?
Access Token 用于访问资源,寿命短;Refresh Token 用于获取新的 Access Token,寿命长。
参考来源
- 名称:Django REST Framework Simple JWT
- 标题:Settings - Django REST Framework Simple JWT documentation
- URL:https://django-rest-framework-simplejwt.readthedocs.io/en/latest/settings.html