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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:51:01