Superset API调用报错:CSRF会话令牌缺失问题求助
解决Superset POST请求「The CSRF session token is missing」问题
核心排查点及修复步骤
1. 确保请求头同时携带CSRF令牌和会话Cookie
Superset的CSRF验证依赖会话Cookie与X-CSRFToken请求头的配对,二者必须同时存在且关联同一会话:
- 登录成功后,从响应Cookie中提取
session(或superset_session,依Superset版本而定)和csrf_token(键名可能为csrf_token或XSRF-TOKEN) - 发起POST请求时,在请求头中同时添加这两项:
headers = { 'X-CSRFToken': '你的CSRF令牌值', 'Cookie': 'session=你的会话Cookie值; csrf_token=你的CSRF令牌值' }
2. 正确获取CSRF令牌
禁止从静态页面或未登录的初始请求中提取CSRF令牌,必须在登录成功后从响应Cookie或响应内容中获取:
import requests # 登录请求 login_res = requests.post( 'http://superset:8088/api/v1/security/login', json={'username': 'admin', 'password': 'admin', 'provider': 'db'} ) # 从响应Cookie中提取令牌和会话 csrf_token = login_res.cookies.get('csrf_token') session_cookie = login_res.cookies.get('session')
3. 匹配POST请求的Content-Type和数据格式
如果向Superset API发送JSON数据,必须设置正确的Content-Type:
star_res = requests.post( 'http://superset:8088/api/v1/dashboard/1/star', json={'starred': True}, headers={ 'X-CSRFToken': csrf_token, 'Cookie': f'session={session_cookie}', 'Content-Type': 'application/json' } )
若为表单提交,需将CSRF令牌放在表单字段csrf_token中,同时将Content-Type设为application/x-www-form-urlencoded。
4. 验证Superset部署的CSRF配置
检查部署命令中的CSRF相关环境变量,确保配置正确:
docker run -d \ -p 8088:8088 \ -e SUPERSET_SECRET_KEY='your-secret-key' \ -e WTF_CSRF_ENABLED=True \ -e WTF_CSRF_TIME_LIMIT=3600 \ apache/superset
注意:WTF_CSRF_ENABLED需设为True(默认开启),若之前设为False会导致令牌逻辑异常。
5. 保持会话上下文一致
建议使用requests.Session()维护会话,自动处理Cookie传递,避免令牌与会话不匹配:
session = requests.Session() # 登录,会话自动保存Cookie session.post( 'http://superset:8088/api/v1/security/login', json={'username': 'admin', 'password': 'admin', 'provider': 'db'} ) # 发起POST请求,只需添加CSRF头 csrf_token = session.cookies.get('csrf_token') star_res = session.post( 'http://superset:8088/api/v1/dashboard/1/star', json={'starred': True}, headers={'X-CSRFToken': csrf_token} )
报错日志验证
若以上步骤无效,检查报错日志中的请求详情:
- 确认请求头是否包含
X-CSRFToken和正确的会话Cookie - 对比代码中使用的CSRF令牌与Superset前端页面当前会话的令牌是否一致
内容的提问来源于stack exchange,提问作者sam-wright-1
相关产品推荐
相关产品推荐

