在Superset 2.0.0中添加带JWT认证的Flask AppBuilder API端点
在Superset 2.0.0中添加受JWT认证保护的自定义API端点
你的问题出在BaseApi类未实例化就直接注册,Flask Appbuilder的BaseApi必须先实例化才能作为蓝图被Superset加载。下面是完整的正确实现方案:
1. 编写带认证保护的自定义API
创建greeting.py,继承BaseApi后实例化对象,同时指定路由前缀避免和Superset内置接口冲突:
# greeting.py from flask_appbuilder.api import BaseApi, expose, protect class GreetingApi(BaseApi): # 纯API调用无需CSRF令牌,设置为True csrf_exempt = True # 自定义API前缀,防止与Superset原有路由冲突 url_prefix = "/api/v1/custom" @protect # 启用Superset的JWT认证保护 @expose("/hello", methods=["GET"]) def greeting(self): return self.response(200, message="Hello authenticated user!") # 必须实例化类,才能作为蓝图注册 greeting_api = GreetingApi()
2. 在Superset配置中注册蓝图
修改superset_config.py,导入实例化后的API对象并添加到BLUEPRINTS列表:
# superset_config.py from greeting import greeting_api BLUEPRINTS = [greeting_api]
3. 验证认证效果
- 先通过Superset内置的
/api/v1/security/login接口获取JWT令牌,请求体示例:{ "username": "你的用户名", "password": "你的密码", "provider": "db" } - 访问自定义端点
/api/v1/custom/hello时,在请求头中携带令牌:Authorization: Bearer <你的JWT令牌> - 若未携带令牌或令牌无效,会返回
401 Unauthorized,说明认证保护生效。
关键细节说明
@protect装饰器会自动校验请求头中的JWT令牌,仅允许通过Superset登录生成的有效令牌访问。- 必须指定
url_prefix,否则容易和Superset内置的/api/v1路由产生冲突。 - 如果API需要处理POST/PUT等请求,需在
@expose中明确指定methods参数,同时保持csrf_exempt=True(API场景无需CSRF校验)。
内容的提问来源于stack exchange,提问作者Nicolaz
相关产品推荐
相关产品推荐

