Lightdash OneLogin SSO 实现解析:从同步策略构建到按组织动态注册的完整链路

发布时间:2026/9/17 23:46:06

Lightdash OneLogin SSO 实现解析:从同步策略构建到按组织动态注册的完整链路 Lightdash OneLogin SSO 实现解析从同步策略构建到按组织动态注册的完整链路【免费下载链接】lightdashAgentic BI. Analytics at the speed of code ⚡️项目地址: https://gitcode.com/GitHub_Trending/li/lightdashLightdash 支持两条并行的 OneLogin 单点登录路径基于环境变量、面向整个实例的实例级配置以及存储于数据库、面向共享多组织部署的按组织配置。本文基于 docs/onelogin-sso.md 展开并结合 oneLoginStrategy.ts、apiV1Router.ts 等源码讲清 OneLogin SSO 的策略构建机制、动态注册与缓存原理、配置字段、发现流程和完整的文件地图读完后你可以理解 Lightdash 如何在一个实例上为不同组织分别接入各自的 OneLogin 租户。一、两条并行的 OneLogin SSO 路径Lightdash 中的 OneLogin SSO 遵循与 Azure AD SSO 相同的模型两者共享发现discovery、跨组织过滤cross-org filter和灰度发布rollout机制实例级env-based通过环境变量配置一个 OneLogin 应用对实例上的所有用户生效是最早的实现按组织per-orgDB-stored在共享多组织实例上每个组织通过Settings → Single Sign-On管理面板配置自己的 OneLogin 应用。两条路径并存且当按组织配置命中用户邮箱域名时按组织配置优先于实例级配置会抑制后者。OneLogin 文档只覆盖 OneLogin 特有的部分发现流程、跨组织过滤、灰度开关sso-organization-settingsfeature flag等共享机制可参考 Azure AD 文档。二、策略机制从 issuer 模板化端点同步构建策略OneLogin 与通用 OIDC见 OIDC SSO 文档的关键区别在于它使用passport-openidconnect且各端点直接从 issuer 模板化生成{issuer}/oidc/2/auth、/token、/me因此构建策略是同步的——无需访问 issuer 的 discovery 文档。这与 Azure AD端点由 tenant ID 模板化一致而不同于通用 OIDC 的Issuer.discover()异步发现。核心构建函数createOneLoginStrategyForConfig位于 oneLoginStrategy.tsexport const createOneLoginStrategyForConfig ( config: OneLoginSsoConfig, organizationUuid?: string, ): OpenIDConnectStrategy new OpenIDConnectStrategy( { clientID: config.oauth2ClientId, clientSecret: config.oauth2ClientSecret, issuer: new URL(/oidc/2, config.oauth2Issuer).href, callbackURL: new URL( /api/v1${lightdashConfig.auth.oneLogin.callbackPath}, lightdashConfig.siteUrl, ).href, authorizationURL: new URL(/oidc/2/auth, config.oauth2Issuer).href, tokenURL: new URL(/oidc/2/token, config.oauth2Issuer).href, userInfoURL: new URL(/oidc/2/me, config.oauth2Issuer).href, passReqToCallback: true, }, genericOidcHandler( OpenIdIdentityIssuerType.ONELOGIN, undefined, organizationUuid ? { organizationUuid, provider: OrganizationSsoProvider.ONELOGIN, } : undefined, ), );从源码可以看到几个要点三个端点均由 issuer 推导authorizationURL、tokenURL、userInfoURL分别为{issuer}/oidc/2/auth、{issuer}/oidc/2/token、{issuer}/oidc/2/meissuer选项则取{issuer}/oidc/2。这正是无需 discovery、同步构建的原因回调地址由siteUrl与配置的callbackPath拼接即默认/api/v1/oauth/redirect/oneLogin组织上下文透传当传入organizationUuid按组织路径时通过genericOidcHandler携带{ organizationUuid, provider: OrganizationSsoProvider.ONELOGIN }用于回调后把用户匹配到正确的组织认证回调逻辑复用oidcStrategy.ts中的genericOidcHandlerOneLogin 与通用 OIDC 共用同一套处理管线仅 issuer 类型不同。实例级env-based路径环境变量在 parseConfig.ts 中解析环境变量对应配置AUTH_ONE_LOGIN_OAUTH_ISSUEROneLogin OIDC issuer URLAUTH_ONE_LOGIN_OAUTH_CLIENT_IDOneLogin 应用 Client IDAUTH_ONE_LOGIN_OAUTH_CLIENT_SECRETOneLogin 应用 Client SecretloginPath/callbackPath固定为/login/oneLogin与/oauth/redirect/oneLogin可用性由isOneLoginPassportStrategyAvailableToUse判定oneLoginStrategy.ts三个字段齐备才可用。可用时env-based 的oneLoginPassportStrategy与按组织路径共用同一个构建器oneLoginStrategy.tsexport const oneLoginPassportStrategy isOneLoginPassportStrategyAvailableToUse ? createOneLoginStrategyForConfig({ oauth2ClientId: lightdashConfig.auth.oneLogin.oauth2ClientId!, oauth2ClientSecret: lightdashConfig.auth.oneLogin.oauth2ClientSecret!, oauth2Issuer: lightdashConfig.auth.oneLogin.oauth2Issuer!, }) : undefined;该策略在App.ts启动时以名称oneLogin注册作为按组织配置不可用时的回退fallback。三、按组织路径动态策略缓存、解析与回调重注册按组织策略的动态注册逻辑集中在 apiV1Router.ts完全镜像 Azure AD 的缓存模式。策略缓存与注册每个组织的策略以oneLogin:orgUuid命名注册到 passport并维护一个带10 分钟 TTL的缓存apiV1Router.tsconst oneLoginStrategyCache new Map string, { timer: ReturnTypetypeof setTimeout } (); const registerOneLoginStrategyForOrg ( organizationUuid: string, config: import(lightdash/common).OneLoginSsoConfig, ): string { const strategyName oneLogin:${organizationUuid}; const existing oneLoginStrategyCache.get(strategyName); passport.use( strategyName, createOneLoginStrategyForConfig(config, organizationUuid), ); if (existing) { clearTimeout(existing.timer); } const timer setTimeout(() { oneLoginStrategyCache.delete(strategyName); passport.unuse(strategyName); }, AZURE_AD_STRATEGY_TTL_MS); oneLoginStrategyCache.set(strategyName, { timer }); return strategyName; };由于 OneLogin 端点是同步模板化的registerOneLoginStrategyForOrg是同步函数——对比之下通用 OIDC 因 discovery 网络请求其注册函数是async的。每次重新注册会清理上一个 timer每次请求都重新注册因此配置变更例如轮换 secret会及时生效。按邮箱 login-hint 解析策略名resolveOneLoginStrategyNameapiV1Router.ts的解析顺序从请求中取login_hint用户邮箱调用OrganizationSsoService.findEnabledMethodForEmail(email, OrganizationSsoProvider.ONELOGIN)查找命中的按组织配置命中则注册并返回oneLogin:orgUuid未命中时若 env-based 策略可用回退返回oneLogin两者都不可用则返回undefined路由侧返回 404OneLogin SSO is not configured。登录与回调路由登录路由GET /api/v1/login/oneLoginapiV1Router.ts解析策略名后把名字存入req.session.oauth.oneLoginStrategyName再以scope: [openid, profile, email]发起passport.authenticate(strategyName, …)回调路由GET /api/v1/oauth/redirect/oneLoginapiV1Router.ts优先从 session 读回策略名session 缺失时重新解析若策略名形如oneLogin:orgUuid且缓存已被驱逐例如登录和回调之间发生了服务重启则用organizationUuid从数据库重新取出配置并调用registerOneLoginStrategyForOrg重新注册随后执行passport.authenticate失败/成功分别重定向到getOidcRedirectURL(false/true)(req)指定的页面。这条session 存策略名 回调按需重注册的链路是 per-org SSO 在重启、缓存驱逐等情况下仍能正确完成 OAuth 会话的关键设计。四、配置字段与加密存储按组织配置以加密形式存储在organization_sso_configurations表中provider oneLogin。OneLogin 特有的字段字段用途oauth2IssuerOneLogin OIDC issuer URLauth/token/userinfo 端点均由它推导oauth2ClientId/oauth2ClientSecretOneLogin 应用凭据。secret 加密存储、永不回传API 响应中以hasClientSecret布尔值代替表结构含enabled、override_email_domains、email_domains、allow_password等共享列由 migration 创建并经后续 migration 扩展config列为加密 JSONAES-256-GCM密钥派生自LIGHTDASH_SECRET。共享标志列与 Azure AD 行为一致列行为enabled该 SSO 方式的主开关。关闭后对任何人不可见override_email_domains为 true 时由本行的email_domains白名单主导发现为 false 时使用组织既有的organization_allowed_email_domains列表email_domains严格白名单仅在override_email_domains true时生效列表为空且 override 开启 该方式对发现不可见allow_password为 true 时命中该方式的用户仍可邮箱/密码登录为 false 时隐藏密码输入只呈现 OneLogin 按钮完整的发现流程getLoginOptions→findEnabledMethodsForEmailDomain→ 匹配行替换实例级 provider → 密码框宽松可见规则与跨组织过滤逻辑见 Azure AD 文档。五、发现、登录选项与管理端点getLoginOptions是 provider 无关的oneLogin以 1:1 映射到OpenIdIdentityIssuerType.ONELOGIN因此发现、force-redirect新用户唯一命中时自动跳转和密码抑制行为与 Azure 完全一致无需单独实现管理 API 端点定义于 OrganizationSsoController.tsGET /api/v1/org/sso/oneLoginGetOneLoginSsoConfig— 返回当前组织的 OneLogin 配置摘要脱敏PUT /api/v1/org/sso/oneLoginUpsertOneLoginSsoConfig— 创建/更新配置DELETE /api/v1/org/sso/oneLoginDeleteOneLoginSsoConfig— 删除配置未配置时抛NotFoundError。服务层实现位于 OrganizationSsoService.ts 的getOneLoginConfig/upsertOneLoginConfig/deleteOneLoginConfigupsert 路径会对oauth2Issuer做 URL 校验OneLogin issuer URL。管理面板受manage OrganizationCASL 能力与sso-organization-settingsfeature flag 双重门禁发布方式共享云端按组织插feature_flag_overrides行或自托管设置ENABLED_FEATURE_FLAGSsso-organization-settings与 Azure AD 相同。六、前端组件管理面板OneLoginSsoPanel.tsx 复用ONELOGIN_LOGO供组织管理员填写 issuer / client ID / client secret 并切换共享标志列数据 hooksuseOrganizationSso.ts 中的useOneLoginSsoConfig系列 hooks 负责配置的读取与保存登录页按钮ThirdPartySignInButton 在ONELOGIN分支支持forceShow配合 force-redirect 场景直接呈现 OneLogin 登录按钮。七、OneLogin 相关文件地图路径用途packages/common/src/types/organizationSso.tsONELOGINprovider 枚举、OneLoginSsoConfig及 summary/upsert/response 类型定义packages/backend/src/models/OrganizationSsoModel.tsprovider 映射表中ONELOGIN → OneLoginSsoConfigpackages/backend/src/services/OrganizationSsoService/OrganizationSsoService.tsget/upsert/deleteOneLoginConfig服务方法packages/backend/src/ee/controllers/OrganizationSsoController.ts/api/v1/org/sso/oneLogin三个管理端点packages/backend/src/controllers/authentication/strategies/oneLoginStrategy.tscreateOneLoginStrategyForConfig构建器与可用性判定packages/backend/src/routers/apiV1Router.tsoneLogin:orgUuid策略缓存与解析、登录/回调路由改造packages/frontend/src/components/UserSettings/OrganizationSso/OneLoginSsoPanel.tsx组织管理员面板 UIpackages/frontend/src/hooks/organization/useOrganizationSso.tsuseOneLoginSsoConfighooks八、小结Lightdash 的 OneLogin SSO 是模板化端点 同步策略构建 按组织动态注册三者的组合端点由 issuer 推导使其免 discovery、构建同步oneLogin:orgUuid命名空间加 10 分钟 TTL 缓存使共享实例可并行承载多组织session 中存储策略名、回调时按 DB 重注册则保证了服务重启后的会话连续性。整体架构与 Azure AD 完全同构因此阅读 azure-ad-sso.md 是理解 OneLogin 路径的前提而 OneLogin 特有的差异集中在 oneLoginStrategy.ts 的端点模板与 apiV1Router.ts 的缓存解析逻辑这两处。【免费下载链接】lightdashAgentic BI. Analytics at the speed of code ⚡️项目地址: https://gitcode.com/GitHub_Trending/li/lightdash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/17 23:46:06

福州房地产评估公司怎么选?采购评审与资质门槛拆解

结论先行: 选评估机构,本质是做一次"资格预审"。先看资质是否齐、再看信用有没有硬伤、最后看流程能不能对上你用报告的场景。据福建农业职业技术学院官网2026年8月采购结果公示,该校食堂评估项目经5家供应商竞标,最终由…

2026/9/18 0:46:11

数据库两表比对:NOT EXISTS、JOIN、EXCEPT与NULL陷阱

两表数据比对这件事,写起来简单,真上手才知道坑不少。前阵子帮朋友收拾一个数据库课程设计的收尾工作,两张结构完全一样的订单表——一张是源库导出的快照,一张是同步工具写进来的目标表,跑完对完总行数严丝合缝&#…

2026/9/18 0:46:11

古文学生僻字绝版合集.doc方框乱码:OLE2解析与Unicode建库

简介:《古文学生僻字绝版合集》是一份面向古文爱好者、中文系学生、语文教师及传统文化研习者的生僻字速查文档,针对阅读《楚辞》等先秦两汉文献时字音不明、字义难解、语境隔膜的问题,按字条整理注音、释义与用例,便于随身查阅和…

2026/9/18 0:46:11

MySQL concat()函数详解:字符串拼接的用法、NULL处理与性能优化

1. concat()函数是什么,为什么大家都在用做MySQL开发的人,几乎每天都会碰到这种需求:把几个字段拼成一个字段输出。比如用户表里last_name和first_name分开存,前端要显示完整姓名;订单表里省份、城市、详细地址分开存&…

2026/9/18 0:41:11

Go应用安全实践:从SQL注入到并发竞态的漏洞防护指南

上周给一个 Go 写的内部管理后台做安全评审,二十多个接口里翻出七个有 SQL 拼接,其中一个还带着fmt.Sprintf拼LIMIT后的数字。另一个用 Go 写的消息推送服务更惨,因为用了exec.Command("sh", "-c", ...)拼外部命令&#…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码