You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会自动携带access Cookie,无需手动添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:32:32