ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Metabase 如何用 Guest Embeds 在不需要 Metabase 账号的情况下嵌入仪表板?

Metabase 如何用 Guest Embeds 在不需要 Metabase 账号的情况下嵌入仪表板? Metabase 如何用 Guest Embeds 在不需要 Metabase 账号的情况下嵌入仪表板【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase如果你的目标是把 Metabase 的仪表板嵌入自己的应用页面又不想为每个查看者都创建一个 Metabase 账号那么 Guest Embeds 就是对应的方案。它允许在不做 SSO 登录的前提下嵌入问题、仪表板和文档Metabase 不会为每个查看者创建会话因此请求必须是带有 JWT 签名才安全——Metabase 只有在请求携带用「你的应用与 Metabase 之间共享的密钥」签名的 JWT 时才会加载嵌入内容。JWT 中同时包含要加载的资源引用例如嵌入项的 ID以及参数值。「Guest」只是指认证方式与数据新鲜度无关guest embed 中的仪表板和图表始终展示数据库中的实时数据。本文以嵌入仪表板为主线给出从 Metabase 后台启用、发布嵌入到前端组件和后端签名 JWT 的完整操作路径以及用 locked parameters 按查看者限定数据、配置 JWT 自动刷新这两个可选分支。在 Metabase 中开启 guest embedding进入方式取决于你使用的 Metabase 版本OSSAdmin EmbeddingStarter/Pro/EnterpriseAdmin Embedding Guest embeds打开Enable guest embeds开关。创建并发布 guest embed打开你要嵌入的仪表板也可以按 Ctrl/CmdK 打开命令面板输入 New embed。点击Share图标。选择Embed。在Authentication下选择Guest。可选自定义嵌入的外观。可选为每个参数设置可见性。点击Publish。复制向导生成的代码片段加入你的应用。前端加载 embed.js 并放置仪表板组件把嵌入脚本和配置加到你的 HTML 中。YOUR_METABASE_URL需要替换成你的 Metabase 实例地址script defer srcYOUR_METABASE_URL/app/embed.js/script script window.metabaseConfig { isGuest: true, instanceUrl: YOUR_METABASE_URL, // Optional. Set this if you want the embed to fetch a fresh JWT // when the current one expires. See Refreshing the JWT below. // guestEmbedProviderUri: /your/apps/endpoint, }; /script然后添加对应组件。仪表板使用metabase-dashboard问题使用metabase-question!-- For dashboards -- metabase-dashboard tokenYOUR_JWT_TOKEN with-titletrue with-downloadsfalse initial-parameters{category:[Gizmo]} /metabase-dashboard !-- For questions -- metabase-question tokenYOUR_JWT_TOKEN/metabase-questiontoken属性是必需的值为你的服务器签发的 JWT。文档明确警告不要把一个固定的 JWT 粘在 HTML 里长期留着——token 会过期嵌入最终会失效。做法是每次页面加载时在你的服务器上新签一个 token 并渲染到token属性或者配置guestEmbedProviderUri见下文让嵌入自行获取和刷新 token。常用组件属性不同嵌入类型支持的属性不同guest embed 的选项比 SSO 嵌入少完整列表见仪表板组件参考和问题组件参考属性说明token必需。你的服务器签发的 JWT。with-title显示或隐藏标题true/false。with-downloads开启或关闭下载true/false仅在 Pro 和 Enterprise 方案中可用。initial-parameters初始参数值的 JSON 字符串非受控例如{category:[Gizmo]}。parameters参数值的 JSON 字符串受控。auto-refresh-interval仅仪表板。自动刷新间隔秒。custom-context转发给你的guestEmbedProviderUri端点字段名为customContext。后端用嵌入密钥签名 JWT你的服务器负责生成用于认证嵌入请求的 JWT。文档给出的 Node.js 示例如下需要npm install jsonwebtoken或写入 package.jsonconst jwt require(jsonwebtoken); const METABASE_SECRET_KEY YOUR_METABASE_SECRET_KEY; const payload { resource: { dashboard: 10 }, // or { question: 5 } for questions params: {}, exp: Math.round(Date.now() / 1000) 10 * 60, // 10 minute expiration }; const token jwt.sign(payload, METABASE_SECRET_KEY);两点需要替换YOUR_METABASE_SECRET_KEY你的嵌入密钥。在Admin EmbeddingPro/Enterprise 方案在Guest embeds标签页中可以看到。该密钥被所有 guest embed 共享任何拿到它的人都能访问所有嵌入产物务必保管好如果重新生成密钥需要同步更新服务器代码。resource: { dashboard: 10 }中的10是顺序 ID即该仪表板 URL 中的数字。Pro 和 Enterprise 方案可以改用 entity IDs它们在你把内容从一台 Metabase 序列化例如从 staging 到生产到另一台时保持不变。可选用 locked parameters 按查看者限定数据如果同一仪表板要给不同的人看不同范围的数据例如每个客户只看自己的数据把参数设为Locked对最终用户隐藏值由你的服务器通过 JWT 传入而不是由查看者设置。在嵌入设置中把参数设为Locked。在服务器端把参数值放进 JWT 的params。发布Publish该条目。例如锁定category参数时服务器代码为const jwt require(jsonwebtoken); const METABASE_SECRET_KEY YOUR_METABASE_SECRET_KEY; const payload { resource: { dashboard: 10 }, params: { category: [Gadget], // Set the locked parameter value to Gadget }, exp: Math.round(Date.now() / 1000) 10 * 60, // 10 minute expiration }; const token jwt.sign(payload, METABASE_SECRET_KEY);客户端代码与普通 guest embed 相同不需要额外属性——参数值由 JWT 决定。最终用户看不到 category 过滤器但仪表板只显示 Gadget 类别的数据或你在params中传入的任意值。维护 locked parameters 时有几条规则来自文档JWT 必须包含所有已发布的 locked parameters。一旦发布了带 locked parameter 的仪表板签名 JWT 时必须包含该参数的名字漏掉时 Metabase 会拒绝请求并记录日志You must specify a value for :parameter-name in the JWT例如参数为category时是You must specify a value for :category in the JWT。想对某个 token 关闭锁定过滤在 JWT 中为该参数传空数组[]const payload { resource: { dashboard: 10 }, params: { category: [], // locked filter is bypassed for this token }, exp: Math.round(Date.now() / 1000) 10 * 60, };多个 locked parameters 之间以AND组合不是OR只想应用其中一部分时对其余参数传[]。锁定的参数会先于展示过滤数据因此它同时会限制同一页面上其他可编辑过滤控件的可选值例如锁定 State 为 Vermont 后City 下拉框只会出现 Vermont 的城市无需手动把两个过滤器关联起来。如果 locked parameter 关联的过滤器又关联了 SQL 问题JWT 中只能传单个值。由于 Metabase 不渲染 locked parameters 为过滤器控件你还可以用它驱动自己构建的自定义过滤组件用户在你的组件里改值后在服务器重新签一个带更新params的 JWT替换到 web 组件的token属性上嵌入就会用新的锁定值重新请求数据。可选配置 guestEmbedProviderUri 自动刷新 JWTguest embed 的 JWT 带exp过期时间。token 过期后嵌入无法加载新数据且查看者之前做的过滤选择在下一次请求时会重置。要在不刷新页面的情况下保持嵌入可用可以在你的服务器上配置一个 token 端点按需签发新的 JWTscript window.metabaseConfig { isGuest: true, instanceUrl: YOUR_METABASE_URL, guestEmbedProviderUri: /api/metabase-guest-token, }; /script需要 token 时嵌入会向guestEmbedProviderUri发送POST请求请求体包含 cookie因此你可以用应用自身的会话认证JSON 体如下{ entityType: dashboard, entityId: 10, customContext: ... }字段说明entityTypedashboard或question。entityId你设置在组件上的仪表板或问题的 ID。customContext可选。你在custom-context属性上设置的字符串或对象。响应是一个只含jwt字段的 JSON 对象{ jwt: YOUR_NEWLY_SIGNED_JWT }两种用法刷新HTML 中预渲染一个初始 JWT 并配置guestEmbedProviderUritoken 过期时嵌入调用端点换新 token。注意刷新发生在过期后下一次数据请求时而不是后台定时器空闲的嵌入不会发起刷新请求。无 JWT 初始化省略token属性改用dashboard-id或question-id嵌入在加载时调用同一端点获取第一个 JWTmetabase-dashboard dashboard-id10/metabase-dashboard文档给出的 Express 端点示例其中认证与授权逻辑仅为示例const jwt require(jsonwebtoken); const METABASE_SECRET_KEY YOUR_METABASE_SECRET_KEY; app.post(/api/metabase-guest-token, (req, res) { // Authenticate using your apps existing session. const user req.session?.user; if (!user) { return res.status(403).json({ error: Not signed in }); } const { entityType, entityId, customContext } req.body; // Authorize the request. The browser picks the entityType and entityId, so // check them against your own rule before signing for them. // This is just an example if (!userCanView(user, entityType, entityId)) { return res.status(403).json({ error: Not allowed }); } const payload { resource: { [entityType]: entityId }, params: paramsFor(user, customContext), exp: Math.round(Date.now() / 1000) 10 * 60, // 10 minute expiration }; res.json({ jwt: jwt.sign(payload, METABASE_SECRET_KEY) }); });由于请求携带应用自身的会话 cookie这个端点可以对未登录你的应用的访客返回403拒绝签发对访客不应看到的仪表板/问题拒签entityType和entityId来自浏览器不做校验就签发的端点会让任何登录访客拿到任意已发布条目的 token以及按访客计算不同的params。同一页面嵌入同一仪表板多次时用custom-context属性区分是哪一个副本在请求 token端点据此返回不同的锁定参数。结果验证与故障判断按文档描述的机制嵌入的判定路径是web 组件把 token 发给 Metabase → Metabase 用你的密钥校验 JWT 签名 → 校验通过则返回嵌入内容未通过则不加载。据此可以核对正常JWT 有效时页面中渲染出仪表板展示的是数据库实时数据参数缺失JWT 漏掉某个 locked parameter 时Metabase 拒绝请求并在日志中输出You must specify a value for :parameter-name in the JWT按参数名检查你的 payloadtoken 过期写死在 HTML 里的固定 JWT 到期后嵌入停止工作这是预期现象改用每次页面加载新签 token 或guestEmbedProviderUri解决。限制与边界Guest embed 是只读的且无法使用以下功能行级和列级安全、数据库路由、钻取Drill-through、用量分析、查询构建器、AI 聊天、自定义可视化。需要这些能力时改用 Modular embedding with SSO。OSS 和 Starter 方案的 guest embed图表和仪表板会显示 Powered by Metabase 横幅移除需要升级到 Pro 或 Enterprise。关闭下载with-downloads仅 Pro/Enterprise 可用OSS/Starter 的外观定制只有浅色/深色主题Pro/Enterprise 有更细粒度的外观选项。guest 嵌入的仪表板上自定义目的地只能使用URL选项外部 URL 会在新标签页打开除非过滤器是锁定的否则过滤器值可以传递到外部 URL。使用 Modular Embedding SDK 时若也要用 guest 认证仍然需要在 Metabase 中打开该条目并完成发布且应用的同一页面只能有一种认证类型不能一个页面里既有一个 guest 认证的问题又有一个 SSO 认证的问题。跨域认证文档明确 guest embeds 跨域工作无需额外配置CORS 设置仅适用于 authenticated embeds。如果要取消嵌入打开该条目的Share Embed选择Guest embedding后点击Unpublish管理员可以在Admin EmbeddingPro/Enterprise 在Guest embeds标签页查看所有已嵌入条目的列表。【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表