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

Django+React认证系统登出403问题:服务端正常前端报错

解决 Django + React 登出 403 Forbidden 问题

1. 配置 Django 跨域(CORS)设置

由于 React 和 Django 运行在不同端口(跨域场景),必须正确配置 CORS 以允许请求携带凭证(如 Session 和 CSRF Cookie):

操作步骤:

  • 安装跨域依赖:
    pip install django-cors-headers
    
  • 在 settings.py 中添加以下配置:
    INSTALLED_APPS = [
        ...
        'corsheaders',  # 新增跨域应用
        ...
    ]
    
    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',  # 必须放在 CommonMiddleware 之前
        'django.middleware.common.CommonMiddleware',
        ...
    ]
    
    # 允许请求携带凭证(关键配置)
    CORS_ALLOW_CREDENTIALS = True
    
    # 允许 React 应用的来源(替换为你的 React 端口,通常是 3000)
    CORS_ALLOWED_ORIGINS = [
        "http://localhost:3000",
        "http://127.0.0.1:3000",
    ]
    
    # 配置 Session Cookie 跨域属性
    SESSION_COOKIE_SAMESITE = 'Lax'  # HTTPS 环境下改为 'None'
    SESSION_COOKIE_SECURE = False    # HTTPS 环境下改为 True
    

2. 确保 CSRF 令牌正确传递

虽然你已配置 Axios 默认值,但可手动验证并显式传递令牌以避免遗漏:

在 React 中添加获取 CSRF 令牌的工具函数:

function getCookie(name) {
  let cookieValue = null;
  if (document.cookie && document.cookie !== '') {
    const cookies = document.cookie.split(';');
    for (let i = 0; i < cookies.length; i++) {
      const cookie = cookies[i].trim();
      if (cookie.substring(0, name.length + 1) === (name + '=')) {
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
        break;
      }
    }
  }
  return cookieValue;
}

修改 Axios 登出请求,显式携带令牌:

const submitLogout = () => {
  const csrfToken = getCookie('csrftoken');
  axios
    .post(
      "http://127.0.0.1:8000/user/logout",
      {},  // POST 请求需传入空请求体
      {
        headers: {
          'X-CSRFToken': csrfToken
        }
      }
    )
    .then(response => {
      console.log(response);
    })
    .catch(error => {
      console.log(error);
    });
}

3. 优化 Django 视图权限(可选但推荐)

为登出视图添加认证权限,确保仅已登录用户可访问:

from rest_framework.permissions import IsAuthenticated

class UserLogOutView(APIView):
    permission_classes = [IsAuthenticated]  # 新增权限控制

    def post(self, request):
        logout(request)
        return Response(status=status.HTTP_200_OK)

4. 调试技巧

  • 打开浏览器开发者工具(F12)→ Network 标签:
    • 查看登出请求的 Headers,确认 X-CSRFToken 头部存在,且 csrftoken Cookie 已发送。
    • 检查 Response 标签,查看 Django 返回的具体错误细节(通常会包含 CSRF 验证失败的原因)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:18:26