Django 跨域请求中 CSRF Cookie 未设置的完整解决方案

秋瑶小哥_4585

秋瑶小哥_4585

2026-03-20

270人浏览

原创

Django 跨域请求中 CSRF Cookie 未设置的完整解决方案

本文详解如何在 React 前端(跨域)与 Django 后端通信时,正确配置 CSRF Cookie 的跨域传输,重点解决 CSRF cookie not set 错误,涵盖 SameSite=None、Secure、CORS 及 Axios 协同配置。

本文详解如何在 react 前端(跨域)与 django 后端通信时,正确配置 csrf cookie 的跨域传输,重点解决 `csrf cookie not set` 错误,涵盖 `samesite=none`、`secure`、cors 及 axios 协同配置。

在现代前后端分离架构中,React 应用部署在独立域名(如 CodeSandbox 的 https://7w37f9-3000.csb.app),而 Django 后端运行在 https://eliptum.tech,二者构成典型的跨域场景。此时若需启用 Django 的 CSRF 保护机制(尤其对 POST/PUT/DELETE 等敏感请求),必须确保 CSRF Token 既能由后端安全下发为 Cookie,又能被前端在后续请求中自动携带——但实践中常因配置疏漏导致浏览器拒绝写入或发送 Cookie,最终抛出 CSRF cookie not set. 错误。

根本原因在于:Django 默认的 CSRF Cookie 配置(CSRF_COOKIE_SAMESITE = 'Lax')禁止其在跨站请求中被浏览器自动包含,即使你已在响应头中手动调用 response.set_cookie(..., samesite='None', secure=True),Django 内部中间件(如 CsrfViewMiddleware)仍会依据全局设置覆盖或忽略该 Cookie 的跨域行为。

✅ 正确解法是全局显式声明 CSRF Cookie 的跨域策略,而非仅依赖视图层手动设置:

# settings.py
CSRF_COOKIE_SAMESITE = 'None'
CSRF_COOKIE_SECURE = True  # 必须为 True,否则 'SameSite=None' 会被浏览器拒绝
CSRF_COOKIE_HTTPONLY = False  # 允许 JavaScript 读取(如需通过 document.cookie 获取)
CSRF_COOKIE_PATH = '/'       # 确保路径覆盖所有 API 端点

⚠️ 注意:CSRF_COOKIE_SECURE = True 是强制前提。SameSite=None 仅在 Secure(即 HTTPS)上下文中被现代浏览器接受;若开发环境使用 HTTP(如 localhost:3000),请改用 CSRF_COOKIE_SECURE = False 并搭配 CSRF_COOKIE_SAMESITE = 'Lax'(仅限开发),但生产环境务必启用 HTTPS。

同时,确保其他关键配置已就位(你已基本完成,此处强调完整性):

Django Wrap
Django Wrap

强戈环形山: q15040409-刻画家功能概述强戈环形山: q15040409-刻画家是一项面向实际任务的技能,主要用于平顶山: 维西翁: 1:1.0. 塔格斯: rap.github: 自动化。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该

下载
  • ✅ CORS_ALLOW_CREDENTIALS = True
  • ✅ CORS_ALLOWED_ORIGINS = ['https://eliptum.tech', 'https://7w37f9-3000.csb.app'](注意:CORS_ORIGIN_WHITELIST 已被弃用,以 CORS_ALLOWED_ORIGINS 为准)
  • ✅ CSRF_TRUSTED_ORIGINS = ['https://eliptum.tech', 'https://7w37f9-3000.csb.app'](Django 4.0+ 必需,用于验证 Referer 头)
  • ✅ 前端 Axios 请求始终携带 withCredentials: true(你已正确设置)
  • ✅ 后端视图响应中无需重复 set_cookie('csrftoken', ...) —— Django 会在 CsrfViewMiddleware 中自动注入符合上述全局配置的 Cookie(包括 Set-Cookie: csrftoken=...; Path=/; SameSite=None; Secure; HttpOnly)

示例修正后的视图(精简版,移除冗余手动 set_cookie):

from django.views import View
from django.http import JsonResponse
from django.middleware.csrf import get_token

class PublicKeyView(View):
    def get(self, request):
        # ... 密钥生成逻辑保持不变 ...
        public_key = public_key.decode('utf-8') if isinstance(public_key, bytes) else public_key
        csrf_token = get_token(request)

        response_data = {
            "public_key": public_key,
            "csrf_token": csrf_token  # 供前端调试查看,非必需
        }
        return JsonResponse(response_data)
        # ✅ Django 自动添加符合 settings.py 的 csrftoken Cookie

最后,验证请求链路是否生效:

  1. 浏览器开发者工具 → Application → Cookies → 检查 https://eliptum.tech 下是否存在 csrftoken Cookie,且 SameSite 显示为 None,Secure 为 True;
  2. Network 面板中,get-public-key 响应头应包含:
    Set-Cookie: csrftoken=xxx; Path=/; SameSite=None; Secure; HttpOnly
    Access-Control-Allow-Origin: https://7w37f9-3000.csb.app
    Access-Control-Allow-Credentials: true
  3. 后续 POST /user/create 请求的请求头中,浏览器应自动携带 Cookie: csrftoken=xxx(无需 Axios 手动添加)。

? 小结:

  • 核心缺失项:CSRF_COOKIE_SAMESITE = 'None' + CSRF_COOKIE_SECURE = True 是跨域 CSRF Cookie 生效的黄金组合;
  • 避免重复操作:不要在视图中手动 set_cookie('csrftoken'),以免与 Django 中间件冲突;
  • 全链路 HTTPS:生产环境必须确保前后端均通过 HTTPS 访问,否则 SameSite=None 将失效;
  • 浏览器兼容性:Firefox 69+、Chrome 80+、Safari 12+ 均支持该配置,旧版需降级方案(如 Token 透传 Header)。

完成上述配置后,CSRF cookie not set 错误将彻底消失,跨域 CSRF 保护即可稳定工作。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

django

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1851

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4964

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29857

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3547

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3567

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2763

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 6.1 官方文档
Django 6.1 官方文档

共0课时 | 0人学习

Django 教程
Django 教程

共28课时 | 10万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 2万人学习