如何在Django REST API中使用JWT实现身份认证与授权?
在Django REST API中实现JWT身份认证(基于djangorestframework-simplejwt)
注意djangorestframework-jwt已停止维护,官方现在推荐使用djangorestframework-simplejwt,这很可能是你之前配置失败的核心原因之一,以下是完整的分步实现方案:
1. 安装依赖包
pip install djangorestframework-simplejwt
(无需额外安装PyJWT,simplejwt已包含相关依赖)
2. 配置settings.py
在INSTALLED_APPS中添加rest_framework:
INSTALLED_APPS = [ # 你的其他项目应用 'rest_framework', ]
配置REST_FRAMEWORK的默认认证类:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), }
可选:添加JWT自定义配置(如token有效期),放在settings.py末尾:
from datetime import timedelta SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30), # 访问令牌有效期 'REFRESH_TOKEN_LIFETIME': timedelta(days=7), # 刷新令牌有效期 'ROTATE_REFRESH_TOKENS': True, # 刷新时自动生成新的刷新令牌 }
3. 配置urls.py
在项目根urls.py中添加token相关路由:
from django.urls import path from rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView, ) urlpatterns = [ # 你的其他路由 path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), ]
4. 创建受保护的API视图
示例一个需要认证才能访问的视图:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated class ProtectedView(APIView): permission_classes = [IsAuthenticated] # 只有认证用户能访问 def get(self, request): return Response({ 'msg': '这是受保护的内容', 'current_user': request.user.username })
在urls.py中添加该视图的路由:
path('api/protected/', ProtectedView.as_view(), name='protected'),
5. 测试流程
获取Token:向
/api/token/发送POST请求,携带用户账号密码(支持JSON或表单格式):{ "username": "你的用户名", "password": "你的密码" }成功后会返回
access(访问令牌)和refresh(刷新令牌)两个字段。访问受保护接口:在请求头中添加
Authorization: Bearer <你的access_token>,然后请求/api/protected/,即可获取带用户信息的响应。刷新Token:当access_token过期后,向
/api/token/refresh/发送POST请求,携带refresh_token:{ "refresh": "你的refresh_token" }会返回新的access_token,无需重新登录。
常见问题排查
- 确保使用的是Django默认User模型,若用自定义用户模型需确认配置正确
- 检查请求头格式:
Authorization字段必须是Bearer+ 空格 + token的格式 - 查看终端错误日志,定位具体报错(比如用户不存在、密码错误、配置覆盖等)
- 确认settings.py中的
REST_FRAMEWORK配置未被其他代码覆盖
内容的提问来源于stack exchange,提问作者jphotis
相关产品推荐
相关产品推荐

