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

跨站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"  # 替换为你的后端实际域名
]

由于前后端属于同主域下的不同子域,需要设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:26:05