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

Django登录后所有POST接口返回403 Forbidden问题求助

问题定位与解决方案

1. 重点检查Django的CSRF_TRUSTED_ORIGINS配置

Django 3.2+版本后,跨域场景下的CSRF验证要求前端域名必须加入CSRF_TRUSTED_ORIGINS,否则登录后(session生效时)会触发严格的来源校验,导致403。在settings.py中添加:

CSRF_TRUSTED_ORIGINS = ['http://localhost:3000']  # 替换为你的前端实际地址,带端口

2. 确认axios全局配置是否生效

确保你的axios配置是全局的,且包含withCredentials(这个是携带cookie的关键):

import axios from 'axios';

// 全局配置axios
axios.defaults.withCredentials = true;
axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = 'X-CSRFToken';

如果是自定义axios实例,要保证所有请求都使用该实例,而非默认axios对象。

3. 处理登录后的CSRF Token刷新

Django在用户登录时会自动刷新CSRF Token,如果前端仍使用登录前缓存的旧Token,就会验证失败。可以在登录成功后手动重新获取最新Token:

// 封装获取CSRF Token的方法
const getLatestCsrfToken = () => {
  const cookieStr = `; ${document.cookie}`;
  const tokenParts = cookieStr.split(`; csrftoken=`);
  return tokenParts.length === 2 ? tokenParts.pop().split(';').shift() : '';
};

// 登录接口调用成功后,更新axios的请求头
axios.post('/api/login/', loginData)
  .then(res => {
    axios.defaults.headers.common['X-CSRFToken'] = getLatestCsrfToken();
  });

4. 核对中间件顺序

确保CorsMiddleware在CsrfViewMiddleware之前加载,否则CORS处理会滞后于CSRF验证:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 必须放在CsrfViewMiddleware之前
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    # 其他中间件...
]

5. 验证请求中的Cookie是否正确携带

在浏览器开发者工具的Network面板中,检查登录后的POST请求:

  • 确认Cookie头中同时包含csrftoken和sessionid
  • 确认X-CSRFToken头的值与最新的csrftokenCookie一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:22:10