React+Axios对接Django REST Framework登出时出现403 Forbidden请求错误
React+Axios对接Django REST Framework登出时出现403 Forbidden请求错误
看起来你已经把基础配置都做了,但登出时Session ID没被正确携带导致403,我来帮你一步步排查并解决问题:
1. 优先检查Django的Session Cookie跨域配置
Django默认的Session Cookie的SameSite属性为Lax,即使是本地127.0.0.1和localhost也可能被浏览器视为不同域名,导致Cookie在登出请求中不被发送。你需要在settings.py里显式调整Session Cookie的相关配置:
# settings.py SESSION_COOKIE_SAMESITE = 'Lax' # 开发环境用Lax即可,跨域场景可设为None(需配合SECURE_COOKIE) SESSION_COOKIE_DOMAIN = '127.0.0.1' # 与前端请求的域名保持一致,比如前端用localhost就改成localhost SESSION_COOKIE_SECURE = False # 开发环境HTTP下设为False,生产环境HTTPS必须设为True SESSION_COOKIE_HTTPONLY = True # 保持默认安全配置,避免前端JS直接访问Session Cookie
2. 简化Axios登出请求,移除冗余配置
你已经在全局Axios实例中配置了自动获取CSRF Token和withCredentials: true,手动拆分Cookie获取CSRF Token的操作完全多余,还可能因Cookie格式问题导致Token错误。同时要注意登出请求的URL路径必须以斜杠开头,避免相对路径拼接错误:
// 修正后的Logout函数 function logout(e) { e.preventDefault(); // 移除手动获取CSRF Token的代码,依赖Axios自动配置 // URL开头加斜杠,确保基于baseURL正确拼接 client.post("/api/logout/", {}) .then(res => { navigate("/login"); }).catch(error => { console.error('Logout failed:', error); }); }
3. 补全Django的CORS与CSRF信任配置
确保settings.py里的信任域名完全覆盖前端的访问地址,避免因域名不匹配被拦截:
# settings.py CORS_ALLOW_CREDENTIALS = True CORS_ALLOWED_ORIGINS = [ "http://127.0.0.1:5173", "http://localhost:5173", ] CSRF_TRUSTED_ORIGINS = [ "http://127.0.0.1:5173", "http://localhost:5173", ]
4. 给登出视图添加日志排查
如果以上配置调整后仍有问题,可以在Django的登出视图中添加日志,确认请求是否携带了有效Session:
# views.py from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from django.contrib.auth import logout import logging logger = logging.getLogger(__name__) class LogoutView(APIView): permission_classes = [IsAuthenticated] def post(self, request): # 打印日志确认用户和Session状态 logger.info(f"Logout request received - User: {request.user}, Session ID: {request.session.session_key}") if request.user.is_authenticated: logout(request) return Response({'message': 'Logged out successfully'}) else: return Response({'detail': 'User not authenticated'}, status=403)
查看Django的控制台日志,就能判断是前端没发送Session Cookie,还是后端没识别到用户。
备注:内容来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

