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

HTTP-only Cookie响应存在但请求未携带,致认证失败求助

React对接Django API:HTTP-only Cookie未传递的解决方案

核心排查与修复步骤

1. 修正Cookie的Domain配置

  • 登录接口设置Cookie时,必须指定匹配前后端的domain参数(不带端口)。比如前后端都在localhost下,设置domain='localhost',否则浏览器会判定Cookie不属于当前域名,不会携带。
  • Django代码示例:
    response.set_cookie(
        'authToken',
        token_value,
        httponly=True,
        secure=True,
        samesite='None',
        domain='localhost',  # 关键:统一主域名
        max_age=604800  # 7天有效期
    )
    

2. 处理CSRF保护(若启用)

  • 后端启用CSRF时,前端请求必须携带X-CSRFToken头,同时保持credentials: 'include':
    // 获取CSRF Token
    const getCsrfToken = () => {
      const cookieStr = `; ${document.cookie}`;
      const tokenParts = cookieStr.split(`; csrftoken=`);
      return tokenParts.length === 2 ? tokenParts.pop().split(';').shift() : '';
    };
    
    // 受保护接口请求示例
    fetch('https://localhost:8000/api/protected/', {
      method: 'GET',
      credentials: 'include',
      headers: {
        'X-CSRFToken': getCsrfToken()
      }
    });
    
  • 同步Django的CSRF Cookie配置:
    # settings.py
    CSRF_COOKIE_SECURE = True
    CSRF_COOKIE_SAMESITE = 'None'
    

3. 验证浏览器Cookie状态

  • 打开Chrome开发者工具→应用→Cookie,检查authToken的属性:
    • 确认Secure、HttpOnly已勾选
    • SameSite值为None
    • Domain与前后端主域名一致
    • 自签名证书需手动添加浏览器信任,否则Secure Cookie可能被拦截

4. 完善Django全局配置

  • 确保settings.py中以下配置正确:
    CORS_ALLOW_CREDENTIALS = True
    CORS_ALLOWED_ORIGINS = ["https://localhost:5173"]  # 完整HTTPS地址
    SESSION_COOKIE_SECURE = True
    SESSION_COOKIE_SAMESITE = 'None'
    

5. 规避浏览器隐私模式限制

  • 隐私模式会严格限制第三方Cookie,测试时使用普通窗口

6. 确认Django HTTPS服务正确性

  • 用runserver_plus启动时,确保SSL证书配置正确,且request.is_secure()返回True:
    python manage.py runserver_plus --cert-file cert.pem --key-file key.pem
    
  • 若request.is_secure()为False,Django会拒绝处理Secure Cookie,导致无法携带

内容的提问来源于stack exchange,提问作者Jordan Regan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:22:33