适配前后端中转场景:Flask-WTF如何在路由手动生成CSRF Token?
核心方案
Flask-WTF内置generate_csrf()工具函数,可直接生成CSRF Token并支持存入Cookie;同时其CSRFProtect扩展会自动完成请求时的Token校验,完全适配你的后端-前端服务器-客户端转发架构。
实现步骤
初始化CSRF保护扩展
首先配置Flask密钥并初始化CSRFProtect,这是生成和校验CSRF Token的基础:from flask import Flask, jsonify, make_response from flask_wtf.csrf import CSRFProtect, generate_csrf from http import HTTPStatus app = Flask(__name__) # 必须设置密钥,用于加密生成CSRF Token app.config['SECRET_KEY'] = 'your-secure-secret-key-here' # 可选:自定义Cookie名称,默认值为'csrf_token' app.config['WTF_CSRF_COOKIE_NAME'] = 'csrf_token_cookie' # 初始化CSRF保护 csrf = CSRFProtect(app)在路由中生成并分发Token
在路由函数里,生成Token后同时存入Cookie、加入响应JSON数据,通过前端服务器转发给客户端:@app.route('/') def home(): response_data = { "status": "ok" } # 生成CSRF Token并自动存入配置好的Cookie csrf_token = generate_csrf(set_cookie=True) # 将Token加入响应数据,供前端嵌入表单使用 response_data['form_csrf_token'] = csrf_token # 返回响应 return make_response(jsonify(response_data)), HTTPStatus.OK.value若需自定义Cookie参数(有效期、域名等),可拆分操作手动设置:
@app.route('/') def home(): response_data = { "status": "ok" } # 仅生成Token,不自动设置Cookie csrf_token = generate_csrf() response_data['form_csrf_token'] = csrf_token response = make_response(jsonify(response_data)) # 手动配置Cookie安全参数 response.set_cookie( 'csrf_token_cookie', csrf_token, expires=3600, # 有效期1小时 secure=True, # 仅HTTPS环境下传输 httponly=True # 禁止JS读取,防范XSS攻击 ) return response, HTTPStatus.OK.value客户端提交与自动校验
客户端获取form_csrf_token后,提交表单时只需将其作为csrf_token字段放入表单数据,或作为X-CSRFToken请求头携带。CSRFProtect扩展会自动校验请求中的Token与Cookie中的Token是否一致,无需额外编写校验代码。
关键说明
- 无需生成两个独立Token:同步器令牌模式的核心是Cookie中的Token与请求携带的Token一致,Flask-WTF的校验机制基于此设计,无需额外生成关联Token。
- 密钥安全性:
SECRET_KEY必须使用随机、高复杂度字符串,避免泄露,否则CSRF保护会失效。 - Cookie安全配置:建议开启
secure=True和httponly=True,进一步提升安全性。
内容的提问来源于stack exchange,提问作者LLL
相关产品推荐
相关产品推荐

