Django DRF问题:TokenRefreshView无法获取刷新Token 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=NoneCookie有限制,可临时禁用浏览器安全检查(仅用于开发) - 确保前端与后端域名后缀一致(如均为
localhost),避免被判定为完全跨域
内容的提问来源于stack exchange,提问作者Lord Konadu Kweku
相关产品推荐
相关产品推荐

