Flask-WTF提示会话中缺少CSRF Token问题求助(Flask+React架构)
解决Flask-WTF CSRF验证失败("The CSRF session token is missing")的问题
看起来你遇到的问题核心在于跨域场景下session和CSRF token的传递机制没配置对,结合你用的Flask-WTF 0.14.3版本,我来一步步帮你排查修复:
1. 后端补全关键配置:Secret Key与CORS凭证支持
你的代码里漏掉了两个核心配置:Flask Session依赖的secret_key,以及跨域场景下允许传递cookie的CORS参数。Flask-WTF的CSRFProtect需要从Session中读取验证用的token,如果Session无法正常存储或传递,就会提示token缺失。
修改后端代码:
from flask import Flask from flask_cors import CORS from flask_wtf.csrf import CSRFProtect, generate_csrf app = Flask(__name__) # 必须设置Secret Key,Flask Session和CSRF验证都依赖它 app.secret_key = 'your-strong-random-secret-key-here' # 替换成实际的随机密钥 CSRFProtect(app) # 开启supports_credentials,允许跨域请求携带cookie CORS(app, supports_credentials=True) @app.after_request def inject_csrf_token(response): csrf_token = generate_csrf() # 为cookie添加SameSite属性适配现代浏览器,本地开发用secure=False,生产环境改成True response.set_cookie('csrf_token', csrf_token, samesite='Lax', secure=False) return response
2. 前端axios配置:开启凭证携带+动态获取CSRF Token
你的axios实例存在两个问题:一是没有开启withCredentials导致cookie无法传递到后端;二是初始化时一次性获取token,无法应对token刷新的场景。
修改前端代码:
import axios from 'axios'; import Cookies from 'js-cookie' const API_URL = `https://${window.location.hostname}:7000/v2/`; const api = axios.create({ baseURL: API_URL, withCredentials: true, // 关键:允许跨域请求携带cookie headers: { 'Content-Type': 'application/json' } }); // 添加请求拦截器,每次请求前动态获取最新的CSRF Token api.interceptors.request.use(function (config) { const csrfToken = Cookies.get('csrf_token'); if (csrfToken) { config.headers['X-CSRF-Token'] = csrfToken; } return config; }, function (error) { return Promise.reject(error); }); export default api;
3. 验证逻辑与调试要点
Flask-WTF 0.14.3的CSRF验证逻辑是:从请求的Session中取出csrf_token,和请求头的X-CSRF-Token做对比。你之前调试发现Session里有token但CSRFProtect中为空,本质是浏览器没有把Session Cookie传递到后端——因为CORS没开凭证支持,导致后端创建了新的空Session,自然找不到验证用的token。
调试时可以在后端接口中打印Session,确认token是否存在:
@app.route('/your-post-endpoint', methods=['POST']) def test_post(): print("Session中的CSRF Token:", session.get('csrf_token')) return '请求成功'
同时在浏览器控制台的网络请求中,检查Request Headers是否包含:
Cookie字段(包含Session和csrf_token)X-CSRF-Token字段,值与Cookie中的csrf_token一致
内容的提问来源于stack exchange,提问作者paul.ruelle
相关产品推荐
相关产品推荐

