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

Django DRF问题:TokenRefreshView无法获取刷新Token Cookie

解决DRF JWT刷新Token时无法获取HTTP-only Cookie的问题

核心问题排查与解决方案

导致request.COOKIES为空的常见原因集中在跨域配置缺失、Cookie属性设置不当两个方面,以下是针对性修复步骤:

1. 配置Django跨域支持

若前端与后端处于不同域名/端口(如前端localhost:3000、后端localhost:8000),必须通过django-cors-headers开启带凭证的跨域请求:

  • 安装依赖:
pip install django-cors-headers
  • 在settings.py中添加配置:
INSTALLED_APPS = [
    # ...其他应用
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 必须放在CommonMiddleware之前
    'django.middleware.common.CommonMiddleware',
    # ...其他中间件
]

# 允许跨域请求携带Cookie
CORS_ALLOW_CREDENTIALS = True
# 允许的前端域名(替换为你的实际前端地址)
CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
    "https://your-production-frontend.com",
]
# HTTPS环境下需配置CSRF信任来源
CSRF_TRUSTED_ORIGINS = CORS_ALLOWED_ORIGINS

2. 修正Cookie属性设置

默认Cookie属性会导致跨域请求时无法携带,需补充关键参数:
修改SignIn视图中的set_cookie代码:

response.set_cookie(
    "refresh_token",
    str(token),
    httponly=True,
    max_age=settings.SIMPLE_JWT["REFRESH_TOKEN_LIFE_TIME"].total_seconds(),
    samesite='None',  # 跨域POST请求必须设置为None,Lax模式会阻止Cookie传递
    secure=request.is_secure(),  # 本地HTTP开发可设为False,生产HTTPS必须设为True
    path='/',  # 确保Cookie作用域覆盖所有接口路径,避免刷新接口路径不匹配
)

3. 验证前端请求配置

确认Axios全局配置未被局部覆盖:

axios.defaults.withCredentials = true;

// 显式指定刷新请求的凭证配置,避免全局设置失效
axios.post('/api/token/refresh/', {}, {
    withCredentials: true
})

4. 本地开发额外提示

  • 部分浏览器(如Chrome)对HTTP环境下的SameSite=None Cookie有限制,可临时禁用浏览器安全检查(仅用于开发)
  • 确保前端与后端域名后缀一致(如均为localhost),避免被判定为完全跨域

内容的提问来源于stack exchange,提问作者Lord Konadu Kweku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:21:08