Django REST框架中dj-rest-auth与JWT认证Postman调用异常求助
DRF+React认证配置问题解决建议
核心问题分析
你的配置混用了JWT Cookie认证和TokenAuthentication,导致不同场景下认证逻辑冲突:
- 使用
JWTCookieAuthentication时,浏览器自动携带Cookie所以正常,但Postman未正确处理Cookie导致token无效; - 切换到
TokenAuthentication后,获取的是DRF Token而非JWT,请求用户接口时未按TokenAuthentication的规则携带凭据,导致认证失败; - 切回JWT Cookie认证后Postman又正常,大概率是之前登录的Cookie还在缓存中。
具体解决步骤
1. 统一认证方案(推荐使用JWT Cookie认证)
保持DEFAULT_AUTHENTICATION_CLASSES为dj_rest_auth.jwt_auth.JWTCookieAuthentication,这是最适合React前端的方案(Cookie自动携带,无需手动存储token):
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES':( 'rest_framework.permissions.AllowAny', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'dj_rest_auth.jwt_auth.JWTCookieAuthentication', ) }
2. 修复JWT配置的关键细节
- 确保settings.py顶部导入
datetime模块:
from datetime import timedelta
否则SIMPLE_JWT中的timedelta会报错,导致token生成异常。
- 保持
SIMPLE_JWT和REST_AUTH的JWT配置一致:
SIMPLE_JWT = { 'AUTH_HEADER_TYPES': ('Bearer',), # 统一用Bearer,避免和JWT关键字冲突 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=600), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), "ROTATE_REFRESH_TOKENS": True, # 开启刷新token旋转,提升安全性 "BLACKLIST_AFTER_ROTATION": True, "UPDATE_LAST_LOGIN": True, "ALGORITHM": "HS512", } REST_AUTH = { 'USE_JWT': True, 'JWT_AUTH_COOKIE': 'access', 'JWT_AUTH_REFRESH_COOKIE': 'refresh', 'JWT_AUTH_HTTPONLY': True, # 设为True防止XSS攻击,React端通过接口刷新token即可 'SESSION_LOGIN': False, 'OLD_PASSWORD_FIELD_ENABLED': True, }
3. Postman中正确请求的方式
- 先调用登录接口
/dj-rest-auth/login/(POST请求,携带email和password); - 确保Postman开启Send cookies选项(默认开启),登录成功后Cookie会自动保存;
- 后续请求
/dj-rest-auth/user/时,Postman会自动携带accessCookie,无需手动添加Authorization头。
4. React前端适配配置
React端发送请求时,需要添加withCredentials: true,确保Cookie能跨域携带:
// 示例:用axios请求 axios.get('http://localhost:8000/dj-rest-auth/user/', { withCredentials: true })
5. 若需兼容TokenAuthentication(可选)
如果必须同时支持两种认证方式,可将两个认证类都加入配置:
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES':( 'rest_framework.permissions.AllowAny', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'dj_rest_auth.jwt_auth.JWTCookieAuthentication', 'rest_framework.authentication.TokenAuthentication', ) }
此时使用TokenAuthentication获取的token,请求时需在Header中添加:
Authorization: Token <你的token值>
内容的提问来源于stack exchange,提问作者Denis Tosh
相关产品推荐
相关产品推荐

