Django+React架构下document.cookie无法获取csrftoken求助
Domain属性不匹配
检查Django的CSRF_COOKIE_DOMAIN配置,确保它和前端页面的域名一致。如果前端是example.com、后端是api.example.com,可以将CSRF_COOKIE_DOMAIN设为.example.com(注意前缀的点,支持子域名共享Cookie)。本地开发的localhost场景下,无需设置该属性,保持默认即可。Secure属性与传输协议不兼容
当SameSite=None时,Chrome强制要求Cookie必须带有Secure属性(仅通过HTTPS传输)。如果开发环境使用HTTP,需要在Django的settings.py中设置CSRF_COOKIE_SECURE = False;生产环境使用HTTPS时则设为True。若前端是HTTP、后端Cookie带Secure,浏览器会存储Cookie但JS无法读取。Path属性限制过严
检查CSRF_COOKIE_PATH的设置,默认值是/,如果被修改为/api/这类窄路径,前端页面在根路径下就无法读取该Cookie。确保该值设为/,让Cookie在整个域名下可访问。跨域请求的Credentials配置缺失
如果React和Django属于跨域环境:- 前端发起请求时必须携带凭证:使用Axios则设置
withCredentials: true,使用fetch则设置credentials: 'include'。 - Django端需开启CORS凭证支持:在
settings.py中设置CORS_ALLOW_CREDENTIALS = True,同时CORS_ALLOWED_ORIGINS要明确指定前端域名,不能使用通配符*。
- 前端发起请求时必须携带凭证:使用Axios则设置
Chrome第三方Cookie阻止策略
若前后端是不同域名(包括localhost不同端口),Chrome默认可能阻止第三方Cookie。可以临时在Chrome启动时添加参数--disable-site-isolation-trials --disable-features=CrossSiteDocumentBlockingIfIsolating,CrossSiteDocumentBlockingAlways绕过限制;生产环境则需要确保域名符合Chrome的第三方Cookie政策(比如使用同一主域名的子域名)。再次确认CSRF_COOKIE_HTTPONLY设置
虽然你已排除这个可能,但建议再检查settings.py中是否显式设置CSRF_COOKIE_HTTPONLY = False,避免第三方中间件或配置覆盖了默认值。
内容的提问来源于stack exchange,提问作者Ngo Tuan Kiet

