跨站POST请求的Django CSRF保护问题:跨子域部署遇403错误
跨子域部署时Django+React的CSRF验证失败解决方法
本地环境下前后端同域运行时,CSRF验证正常,但前端部署在Firebase(https://app.example.com)、后端部署在AWS EKS(不同子域)时,出现403错误,提示内容:
CSRF verification failed. Request aborted.
以下是针对性的排查和解决步骤:
1. 补全CSRF信任域名配置
CSRF_TRUSTED_ORIGINS需要同时包含前端域名和后端域名,仅配置前端域名会导致Django无法信任跨域请求的来源。示例修改:
CSRF_TRUSTED_ORIGINS = [ "http://localhost:3000", "https://app.example.com", "https://api.example.com" # 替换为你的后端实际域名 ]
2. 配置跨子域共享CSRF Cookie
由于前后端属于同主域下的不同子域,需要设置CSRF_COOKIE_DOMAIN让Cookie在所有子域中生效,添加到Django配置:
CSRF_COOKIE_DOMAIN = ".example.com" # 主域前加英文点,适配所有子域 SESSION_COOKIE_DOMAIN = ".example.com" # 会话Cookie同理配置
3. 调整Axios的CSRF获取逻辑
跨域场景下,浏览器同源策略会限制Cookie自动携带,需先主动触发一次GET请求获取CSRF Cookie,再发送业务请求:
- 后端新增一个无逻辑的GET接口用于获取Cookie:
# views.py from django.http import HttpResponse def get_csrf_token(request): return HttpResponse(status=200)# urls.py path('api/get-csrf/', views.get_csrf_token, name='get-csrf'), - 前端修改请求流程,先调用该接口再发送POST请求:
// 先获取CSRF Cookie await instance.get('/api/get-csrf/'); // 再发送业务请求 const response = await instance.post('/api/your-endpoint/', yourData);
4. 确认HTTPS环境配置
由于配置了CSRF_COOKIE_SECURE = True和SESSION_COOKIE_SECURE = True,必须确保前后端都使用HTTPS协议:
- Firebase默认提供HTTPS,无需额外配置;
- AWS EKS后端需配置SSL证书,确保访问地址为HTTPS。
5. 验证CORS配置完整性
确认CORS_ALLOWED_ORIGINS包含前端完整域名(已配置),且CORS_ALLOW_CREDENTIALS = True保持开启,这是跨域携带Cookie的必要条件。
内容的提问来源于stack exchange,提问作者Nikhil Mehta
相关产品推荐
相关产品推荐

