django与vue前后端分离csrf跨域问题

本文详细介绍了如何在Django项目中解决跨域问题,包括安装并配置django-cors-headers包,设置中间件,以及前后端请求配置示例。

1.安装django-cors-headers:

pip install django-cors-headers

2.在settings.py中启用django.middleware.csrf.CsrfViewMiddleware中间件:

MIDDLEWARE = [

 ...

 'corsheaders.middleware.CorsMiddleware',

    'django.middleware.common.CommonMiddleware', # 注意顺序

 ....

]

 

3.跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
    '*'
)

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'Pragma',
)

4.使用get_token(request)获取csrftoken返回给前端(前端第一次访问要用GET方法请求):

import json
from django.middleware.csrf import get_token 
def search(request):
  result = {'Succeed':True,'Data':get_token(request)}
  return HttpResponse(json.dumps(result,ensure_ascii=False),content_type="application/json,charset=utf-8")

5.前端请求配置,这里使用的axios:

const service = axios.create({

baseURL: process.env.BASE_API, // api的base_url

//这三个是重点

xsrfCookieName: 'csrftoken',

xsrfHeaderName: 'X-CSRFToken',

withCredentials: true,

})

// request拦截器设置请求头

service.interceptors.request.use(config => {

let regex = /.*csrftoken=([^;.]*).*$/; // 用于从cookie中匹配 csrftoken值

config.headers['X-CSRFToken'] = document.cookie.match(regex) === null ? null : document.cookie.match(regex)[1];

//注:这里的cookie里的csrftoken是第一次GET请求里返回并保存到cookie里的

// config.headers['Content-Type'] = 'application/x-www-fromurlencodeed'

// config.headers['Access-Control-Allow-Credentials']=true

return config

}, error => {

console.log(error)

Promise.reject(error)

})

<think>嗯,用户的问题是关于在Django前后端分离架构中正确处理CSRF Token的方法。我需要先回忆一下DjangoCSRF机制。Django默认通过中间件CsrfViewMiddleware来防御CSRF攻击,通常在前端模板中会自动生成token,但前后端分离时前端可能是Vue或React,无法直接使用模板标签。 根据引用内容,Django在第一次响应时会设置一个csrftoken的cookie,之后每次POST请求需要携带这个token。对于前后端分离,前端需要从cookie中获取这个token,并在请求头中带上。比如,引用2提到在Django的视图中使用get_token(request)生成token,然后前端需要处理这个token。 另外,引用5提到可以创建一个接口让前端获取token,比如定义一个/getToken的接口,返回生成的token。前端在首次请求时调用这个接口,获取token后存储起来,比如放在Vue的本地存储中,之后在每个请求的头部添加X-CSRFToken。 还需要注意,Django中间件会检查请求头中的X-CSRFToken是否和cookie中的一致。所以前端需要确保两者匹配。引用4提到,Django会在cookie中设置csrftoken,而前端需要在每个POST请求的头部添加这个token。 可能还需要处理问题,比如CORS设置,确保cookie可以传递,需要配置Django的CORS中间件,允许凭证传输,设置CSRF_COOKIE_SAMESITE等。同时,前端在axios或其他HTTP库中设置withCredentials为true,以携带cookie。 总结步骤应该是:后端生成token,通过接口或cookie提供给前端;前端获取后,在请求头中添加;后端验证请求头和cookie中的token是否一致。另外,可能需要调整Django的配置,如禁用CSRF中间件的部分检查,或者使用装饰器确保特定视图的CSRF验证。 用户可能需要具体的代码示例,比如如何在后端创建获取token的接口,前端如何存储和发送token。同时,常见问题比如403 Forbidden错误,可能由于未正确设置cookie或请求头导致,需要检查这些配置是否正确。 还要注意,如果用户完全不想使用CSRF保护,可能需要禁用中间件,但这是不推荐的,应该优先推荐正确的处理方法。可能还需要解释为什么CSRF前后端分离中仍然重要,尽管有些API可能认为不需要,但Django默认还是强制检查的,特别是使用Session认证时。</think>在Django前后端分离架构中处理CSRF Token的核心思路是:**通过接口动态获取Token并在请求头中传递**。以下是具体实现方法: --- ### 一、后端配置 #### 1. 启用CSRF中间件 确保`settings.py`中已启用CSRF保护: ```python MIDDLEWARE = [ ... &#39;django.middleware.csrf.CsrfViewMiddleware&#39;, ... ] ``` #### 2. 创建Token获取接口 在Django中定义专用接口返回CSRF Token: ```python from django.http import JsonResponse from django.middleware.csrf import get_token def get_csrf_token(request): token = get_token(request) # 自动生成并设置Cookie return JsonResponse({&#39;csrftoken&#39;: token}) # 返回JSON格式Token[^5] ``` 前端首次加载时调用此接口获取Token。 #### 3. 配置CORS(场景) 若前端独立部署,需在`settings.py`中添加: ```python CORS_ALLOW_CREDENTIALS = True # 允许携带Cookie CSRF_COOKIE_SAMESITE = &#39;None&#39; # 确保传输 CSRF_COOKIE_SECURE = True # HTTPS环境下启用 ``` --- ### 二、前端处理(以Vue为例) #### 1. 首次请求获取Token ```javascript axios.get(&#39;/api/get_csrf_token/&#39;).then(res => { localStorage.setItem(&#39;csrftoken&#39;, res.data.csrftoken) }) ``` #### 2. 请求头携带Token 在所有`POST/PUT/DELETE`请求中添加: ```javascript axios.post(&#39;/api/endpoint/&#39;, data, { headers: { &#39;X-CSRFToken&#39;: localStorage.getItem(&#39;csrftoken&#39;), }, withCredentials: true // 必须携带Cookie[^4] }) ``` --- ### 三、验证机制说明 1. Django会**自动验证**请求头`X-CSRFToken`Cookie中`csrftoken`是否匹配 2. 若验证失败返回`403 Forbidden`错误,需检查: - Cookie是否成功携带(`withCredentials: true`) - 请求头名称是否正确(默认`X-CSRFToken`) - Token是否过期(默认有效期随会话结束) --- ### 四、特殊场景处理 #### 完全禁用CSRF(不推荐) 可添加装饰器到视图类: ```python from django.views.decorators.csrf import csrf_exempt @csrf_exempt def api_view(request): ... ``` 或在中间件中注释掉`CsrfViewMiddleware`[^1] --- ### 常见问题排查 | 现象 | 解决方案 | |-------|----------| | "CSRF cookie not set" | 确保首次请求调用`get_token`接口[^3] | | 请求失败 | 检查CORS配置和`withCredentials`参数[^4] | | Token过期 | 重新调用获取Token接口 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值