Apache Superset Embedded SDK 实战:利用 Guest Token 将仪表盘安全嵌入自有应用
Apache Superset Embedded SDK 实战利用 Guest Token 将仪表盘安全嵌入自有应用【免费下载链接】supersetApache Superset is a Data Visualization and Data Exploration Platform项目地址: https://gitcode.com/gh_mirrors/supers/superset本文围绕 Apache Superset 仓库中的 superset-embedded-sdk/README.md 展开讲解如何借助官方 Embedded SDK通过 iframe 将 Superset 仪表盘嵌入你自己的 Web 应用并使用 Guest Token 复用宿主应用自身的认证体系让用户无需登录 Superset 即可查看受控数据。读完本文你将掌握 SDK 的安装与调用、Guest Token 的签发原理、iframe 沙箱加固方式以及 SDK 底层的通信与令牌自动刷新机制。SDK 是什么一句话理解嵌入原理Embedded SDK 的核心思路非常简单在宿主页面中动态创建一个 iframe让 iframe 加载 Superset 内部的仪表盘页面从而把仪表盘“镶”进你自己的应用。SDK 负责三件关键事情根据传入的配置构造正确的嵌入式仪表盘 URL{supersetDomain}/embedded/{dashboardId}把宿主后端签发的 Guest Token 通过消息通道传递给 iframe 内的 Superset 页面完成免登录授权提供卸载、获取滚动尺寸、获取永久链接等控制能力方便宿主应用与嵌入式仪表盘交互。其核心实现位于 superset-embedded-sdk/src/index.ts 中的embedDashboard函数源码与本文后续内容一一对应。快速开始安装与最小调用通过 npm 安装SDK 以 npm 包形式发布包名为superset-ui/embedded-sdknpm install --save superset-ui/embedded-sdk安装后在代码中引入并调用import { embedDashboard } from superset-ui/embedded-sdk; embedDashboard({ id: abc123, // 由 Superset 的嵌入配置界面提供 supersetDomain: https://superset.example.com, mountPoint: document.getElementById(my-superset-container), // 任意可容纳 iframe 的 HTML 元素 fetchGuestToken: () fetchGuestTokenFromBackend(), dashboardUiConfig: { // 仪表盘 UI 配置hideTitle、hideTab、hideChartControls、filters.visible、filters.expanded可选、urlParams可选 hideTitle: true, filters: { expanded: true, }, urlParams: { foo: value1, bar: value2, // ... } }, // 可选额外的 iframe sandbox 属性 iframeSandboxExtras: [allow-top-navigation, allow-popups-to-escape-sandbox] });通过 CDN 加载也可以不经过构建工具直接从 CDN 加载。此时 SDK 会以全局变量supersetEmbeddedSdk暴露script srchttps://unpkg.com/superset-ui/embedded-sdk/script script supersetEmbeddedSdk.embedDashboard({ // ... 这里填入与上面示例完全相同的参数 }); /script说明SDK 当前仓库版本为0.1.0-alpha.12见 superset-embedded-sdk/package.json运行时依赖superset-ui/switchboardiframe 消息通信与jwt-decode解析 Guest Token 过期时间。embedDashboard 参数全解embedDashboard是 SDK 唯一的入口函数其类型定义EmbedDashboardParams位于 superset-embedded-sdk/src/index.ts各参数含义如下参数类型必填说明idstring是仪表盘的嵌入配置 ID由 Superset 的嵌入配置界面生成supersetDomainstring是Superset 实例域名需带协议如https://superset.example.commountPointHTMLElement是用于挂载 iframe 的宿主页面 HTML 元素fetchGuestToken() Promisestring是从宿主后端获取 Guest Token 的函数dashboardUiConfigUiConfigType否仪表盘 UI 与行为配置见下debugboolean否是否输出调试日志默认falseiframeTitlestring否iframe 的title属性默认Embedded DashboardiframeSandboxExtrasstring[]否额外的 iframe sandbox 属性默认[]dashboardUiConfig 详解dashboardUiConfig类型为UiConfigType见 src/index.ts控制嵌入后仪表盘的外观与交互字段类型说明hideTitleboolean隐藏仪表盘标题hideTabboolean隐藏 Tab 页签hideChartControlsboolean隐藏图表控制编辑类控件filters.visibleboolean是否显示筛选器面板filters.expandedboolean筛选器面板是否默认展开urlParamsRecordstring, any追加到嵌入式页面 URL 上的自定义查询参数从源码src/index.ts可以看到这些配置最终被序列化为 URL 查询参数传给 iframehideTitle、hideTab、hideChartControls通过位掩码合并为一个数字uiConfighideTitle记 1、hideTab记 2、hideChartControls记 8源码 src/index.tsfilters.visible与filters.expanded分别映射为 URL 参数show_filters与expand_filters映射表定义在 superset-embedded-sdk/src/const.ts若urlParams中的键与上述参数冲突urlParams优先生效见 src/index.ts 的合并顺序。认证与授权Guest Token 机制嵌入式资源使用一种特殊令牌 ——Guest Token访客令牌—— 来授予用户访问 Superset 的权限而无需你的用户直接登录 Superset。整体流程为宿主后端向 Superset 的POST /security/guest_token端点申请令牌再把令牌传给宿主前端前端 SDK 拿到令牌后用它完成仪表盘嵌入。在宿主后端创建 Guest Token宿主后端需要以 HTTPPOST方式请求/security/guest_token请求体描述该令牌将被授予哪些资源访问权限。Guest Token 还可以携带Row Level Security行级安全RLS规则按用户动态过滤数据。发起该请求的代理必须拥有can_grant_guest_token权限。服务端校验逻辑可在 superset/security/api.py 中查看请求体先经GuestTokenCreateSchema校验再校验资源存在性最后调用create_guest_access_token生成令牌。示例请求体{ user: { username: stan_lee, first_name: Stan, last_name: Lee }, resources: [{ type: dashboard, id: abc123 }], rls: [ { clause: publisher Nintendo } ] }字段说明与 superset/security/api.py 中的 schema 一一对应user可选用户属性可用于图表内的 Jinja 模板便于做个性化渲染对应UserSchema中的username、first_name、last_name字段resources必填令牌可访问的资源列表type目前支持dashboard枚举定义见 superset/security/guest_token.pyid为资源标识rls必填行级安全规则列表clause为过滤条件可选dataset指定数据集编号。令牌生效后的角色与默认配置在宿主应用内使用 Guest Token 时Superset 会创建一个匿名用户对象Anonymous user来完成认证。该访客匿名用户默认归属于公共角色对应配置项GUEST_ROLE_NAME Public该配置位于 superset/config.py。Guest Token 底层是 JWT相关的服务端配置也在 superset/config.py配置项默认值说明GUEST_TOKEN_JWT_SECRETtest-guest-secret-change-meJWT 签名密钥生产环境必须更换GUEST_TOKEN_JWT_ALGOHS256JWT 签名算法GUEST_TOKEN_JWT_EXP_SECONDS300令牌有效期默认 5 分钟GUEST_TOKEN_JWT_AUDIENCENoneJWT 受众声明可配置为固定字符串或回调函数启用嵌入式功能的特性开关嵌入功能默认并未开启。服务端需要打开特性开关EMBEDDED_SUPERSET默认False见 superset/config.py。嵌入式仪表盘的查询接口 superset/embedded/api.py 在before_request钩子中检查该开关未开启时直接返回 404。iframe 沙箱默认安全模型与扩展Embedded SDK 默认以sandbox沙箱模式创建 iframe对 iframe 内内容的执行施加限制。SDK 默认添加的 sandbox 属性见 src/index.ts包括allow-same-origin同源策略postMessage通信所必需allow-scripts允许执行脚本allow-presentation支持图表全屏展示allow-downloads支持将图表下载为图片allow-forms允许表单提交allow-popups支持将图表导出为 CSV 时打开弹窗。如需更多能力通过iframeSandboxExtras追加额外的 sandbox 属性例如放开顶层导航与弹窗逃逸iframeSandboxExtras: [allow-top-navigation, allow-popups-to-escape-sandbox]源码级剖析SDK 的底层工作机制1. 通信通道MessageChannel Switchboardiframe 加载完成后SDK 会创建一个MessageChannel把其中一个端口通过postMessage传给 iframe 内的 Superset 页面消息类型常量__embedded_comms__定义在 src/const.ts从而建立宿主窗口与 iframe 之间的双向通信参见 src/index.ts。Switchboard来自superset-ui/switchboard包在此基础上封装出类型安全的消息收发 APIGuest Token 正是通过这条通道发送给 iframe 内的仪表盘页面的。2. Guest Token 自动刷新Guest Token 默认有效期只有 5 分钟因此 SDK 会在令牌临近过期时自动重新调用fetchGuestToken并再次通过消息通道下发新令牌避免嵌入页面因令牌过期而请求失败。刷新时机的计算逻辑位于 superset-embedded-sdk/src/guestTokenRefresh.tsREFRESH_TIMING_BUFFER_MS 5000提前 5 秒刷新避免 Superset 请求恰好落在过期瞬间MIN_REFRESH_WAIT_MS 10000最小刷新间隔 10 秒防止异常场景下高频刷新请求DEFAULT_TOKEN_EXP_MS 300000当解析 JWT 的exp失败时按 5 分钟兜底计算。SDK 通过jwt-decode解析 JWT兼容整数秒与 ISO 字符串两种exp格式见 src/guestTokenRefresh.ts。对应的单元测试在 superset-embedded-sdk/src/guestTokenRefresh.test.ts覆盖了 epoch 秒、带小数的 epoch、ISO 日期、过期令牌与非法日期共五种场景。3. 返回的 EmbeddedDashboard 控制句柄embedDashboard返回一个 Promiseresolve 出的对象类型EmbeddedDashboard见 src/index.ts提供四个方法方法说明getScrollSize()获取 iframe 内容可滚动尺寸{ width, height }用于自适应宿主页面布局unmount()从mountPoint中移除 iframe卸载嵌入式仪表盘getDashboardPermalink(anchor)获取仪表盘指定位置的永久链接getActiveTabs()获取当前激活的 Tab 列表这四个方法都是通过 Switchboard 通道向 iframe 内的页面发起远程调用见 src/index.ts宿主应用可以据此实现“随仪表盘 Tab 切换而联动自身导航”“提供返回按钮时主动卸载”等产品化交互。端到端接入清单将以上内容串成一个完整的接入流程服务端打开特性开关EMBEDDED_SUPERSET True并设置生产环境的GUEST_TOKEN_JWT_SECRET权限为签发令牌的账号授予can_grant_guest_token权限并按需配置GUEST_ROLE_NAME对应的角色及其可访问资源宿主后端实现一个受你自身认证体系保护的接口内部调用POST /security/guest_token构造带user、resources、rls的请求体并返回令牌宿主前端安装superset-ui/embedded-sdk调用embedDashboard把fetchGuestToken指向第 3 步的接口并传入id、supersetDomain、mountPoint交互增强按需使用dashboardUiConfig定制 UI用iframeSandboxExtras调整沙箱策略用返回值中的四个方法实现卸载、滚动自适应、永久链接与 Tab 联动。总结Superset Embedded SDK 以“iframe 嵌入 Guest Token 授权 消息通道通信”三件套提供了一条将 Superset 仪表盘无缝接入自有产品体系的标准路径用户认证完全复用宿主应用数据访问通过resources与 RLS 规则精细收敛令牌自动刷新保证了长时间使用的稳定性沙箱默认策略则守住安全底线。若需更深入地调试或扩展建议直接阅读 superset-embedded-sdk/src/index.ts 与 superset/security/api.py 两份核心源码。【免费下载链接】supersetApache Superset is a Data Visualization and Data Exploration Platform项目地址: https://gitcode.com/gh_mirrors/supers/superset创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

旧电视盒子刷Armbian:斐讯T1变7×24小时小服务器的改造攻略

旧电视盒子刷Armbian:斐讯T1变7×24小时小服务器的改造攻略

旧电视盒子刷Armbian:斐讯T1变724小时小服务器的改造攻略 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk358…

2026/9/18 10:52:15 阅读更多 →
VSCode 安卓开发 flutter doctor 不过?TaoToken 只供 Key,Codex 这样查环境变量

VSCode 安卓开发 flutter doctor 不过?TaoToken 只供 Key,Codex 这样查环境变量

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 10:52:15 阅读更多 →
TRC-20 FullNode全栈搭建:从协议原理到私有链实战

TRC-20 FullNode全栈搭建:从协议原理到私有链实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 13:21:58 阅读更多 →

最新新闻

Coze零代码多智能体协作:从任务拆解到稳定运行的全流程实践

Coze零代码多智能体协作:从任务拆解到稳定运行的全流程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 15:05:44 阅读更多 →
Trae里Anaconda解释器,让Codex走TaoToken后能照着defaultInterpreterPath改对

Trae里Anaconda解释器,让Codex走TaoToken后能照着defaultInterpreterPath改对

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 15:05:44 阅读更多 →
Cursor 跑 MCP,模型通道改到 TaoToken 行不行?

Cursor 跑 MCP,模型通道改到 TaoToken 行不行?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 15:05:44 阅读更多 →
高铁接触网BIM全流程:建模深化施工校核指南

高铁接触网BIM全流程:建模深化施工校核指南

简介:这份PDF文档围绕BIM技术在高速铁路接触网工程中的应用展开,面向铁路电气化工程设计、施工及运维管理人员,针对传统二维CAD设计存在信息孤岛、碰撞难以发现、数据不连续等问题,提供了全生命周期的信息化解决思路。压缩包内共1…

2026/9/19 15:05:44 阅读更多 →
邮箱验证的正确姿势:从一行正则到分层校验的完整指南

邮箱验证的正确姿势:从一行正则到分层校验的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 15:05:44 阅读更多 →
Spring Boot CORS跨域配置与排错:前后端分离联调指南

Spring Boot CORS跨域配置与排错:前后端分离联调指南

简介:Spring Boot 开发者常遇到的跨域问题,在这份 PDF 文档中得到系统梳理,资源面向 Java Web 开发者和前后端分离项目维护人员,讲解 CORS 跨域资源共享机制及其在 Spring Boot 中的落地。文档按两条主线展开:一是自定…

2026/9/19 15:04:43 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →