Backstage v1.2.0-next.3 变更日志深度解读:Kubernetes 插件 OIDC 认证支持与前端组件体验优化
【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage
导读
本文基于仓库中 docs/releases/v1.2.0-next.3-changelog.md 展开,系统梳理 Backstage v1.2.0 系列第三个预发布(next.3)版本中 8 个软件包的 Patch 级变更。文章以本次变更中技术含量最高的 Kubernetes 插件 OIDC 认证支持为主线,结合仓库源码还原其前后端实现原理与配置方式,同时覆盖core-components的无障碍改进、home/org插件增强以及scaffolder/techdocs的依赖回退,帮助读者在升级到该版本时准确评估影响面并完成相应配置。
版本定位:v1.2.0-next.3 是什么
next系列是 Backstage 官方在正式版本发布前迭代的预发布版本,采用vX.Y.Z-next.N的命名约定,用于在最终发布前对候选变更进行集成验证。本变更日志对应v1.2.0-next.3,是v1.2.0正式版发布前的第三个迭代快照,包含 8 个软件包的变更:
| 软件包 | 变更版本 | 变更性质 |
|---|---|---|
| @backstage/core-components | 0.9.4-next.2 | Patch(组件修复与无障碍改进) |
| @backstage/plugin-home | 0.4.21-next.3 | Patch(StarredEntities 卡片增强) |
| @backstage/plugin-kubernetes | 0.6.5-next.3 | Patch(新增 oidc 认证) |
| @backstage/plugin-kubernetes-backend | 0.5.1-next.2 | Patch(新增 oidc 认证) |
| @backstage/plugin-kubernetes-common | 0.2.10-next.1 | Patch(新增 oidc 认证) |
| @backstage/plugin-org | 0.5.5-next.3 | Patch(MyGroupSidebarItem 修复) |
| @backstage/plugin-scaffolder | 1.2.0-next.3 | Patch(依赖回退) |
| @backstage/plugin-techdocs | 1.1.1-next.3 | Patch(依赖回退) |
值得注意的是,plugin-kubernetes三个软件包(前端插件、后端插件、公共类型包)共享同一个变更标识447e060872,表明 OIDC 认证是一次贯穿前后端的系统性能力新增。
核心变更一:Kubernetes 插件新增 OIDC 认证支持
变更内容与意义
本次变更(447e060872)为 Kubernetes 插件新增了oidc认证策略(authProvider),并引入可选的oidcTokenProvider配置项:
Add support for 'oidc' as authProvider for kubernetes authentication and adds optional 'oidcTokenProvider' config value. This will allow users to authenticate to kubernetes cluster using id tokens obtained from the configured auth provider in their backstage instance.
这一能力让用户可以直接使用 Backstage 实例中已配置的认证提供方(如 Okta、Microsoft、Google、GitLab、OneLogin 等)颁发的 ID Token 来访问 Kubernetes API Server,而无需再为每个集群单独维护 Service Account Token。这意味着只要集群启用了 OIDC 认证,Backstage 用户即可借助单点登录体系无缝访问 Kubernetes 资源。
后端实现:OidcStrategy 认证策略
在 plugins/kubernetes-backend/src/auth/OidcStrategy.ts 中实现了OidcStrategy,它实现了AuthenticationStrategy接口。核心逻辑如下:
export class OidcStrategy implements AuthenticationStrategy { public async getCredential( clusterDetails: ClusterDetails, authConfig: KubernetesRequestAuth, ): Promise<KubernetesCredential> { const oidcTokenProvider = clusterDetails.authMetadata[ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER]; if (!oidcTokenProvider || oidcTokenProvider === '') { throw new Error(`oidc authProvider requires a configured oidcTokenProvider`); } const token = (authConfig.oidc as JsonObject | null)?.[oidcTokenProvider]; if (!token) { throw new Error( `Auth token not found under oidc.${oidcTokenProvider} in request body`, ); } return { type: 'bearer token', token: token as string }; } public validateCluster(authMetadata: AuthMetadata): Error[] { const oidcTokenProvider = authMetadata[ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER]; if (!oidcTokenProvider || oidcTokenProvider === '') { return [new Error(`Must specify a token provider for 'oidc' strategy`)]; } return []; } }从源码可以提炼出三个关键实现事实:
- 必须指定
oidcTokenProvider:getCredential与validateCluster双重校验,若集群未配置 token provider,会直接抛出错误(对应测试用例见 OidcStrategy.test.ts,其中验证了'oidc authProvider requires a configured oidcTokenProvider'错误路径); - token 按 provider 名索引:请求体中的
authConfig.oidc是一个以 provider 名为键的对象,例如{ oidc: { okta: '<id_token>' } },后端按集群配置的 provider 名取出对应 ID Token; - 透传为 Bearer Token:取出的 token 最终以
bearer token类型凭证发给 Kubernetes API Server。
该策略通过 buildDefaultAuthStrategyMap.ts 注册到默认策略表:
export const buildDefaultAuthStrategyMap = ({ logger, config }) => new Map([ ['aks', new AksStrategy()], ['aws', new AwsIamStrategy({ config })], ['azure', new AzureIdentityStrategy(logger)], ['google', new GoogleStrategy()], ['googleServiceAccount', new GoogleServiceAccountStrategy({ config })], ['localKubectlProxy', new AnonymousStrategy()], ['oidc', new OidcStrategy()], // <-- 本次新增 ['serviceAccount', new ServiceAccountStrategy()], ]);当某个集群的authProvider为oidc时,请求分发逻辑(见 DispatchStrategy.ts)会从策略表中查找对应的AuthenticationStrategy;若配置了不存在的 provider 值,则会抛出authProvider "xxx" has no AuthenticationStrategy associated with it的错误。
配置方式(config 定位器)
OIDC 认证同时支持config与catalog两种集群定位方式。
方式一:通过app-config.yaml配置
在config集群定位器中,为集群设置authProvider: oidc并指定oidcTokenProvider。oidcTokenProvider的值必须与auth下已配置的认证提供方名称一致,例如使用 Okta:
kubernetes: clusterLocatorMethods: - type: 'config' clusters: - name: test-cluster url: http://localhost:8080 authProvider: oidc oidcTokenProvider: okta # 此值需与 auth.providers 下的配置项匹配 auth: providers: okta: development: clientId: ${AUTH_OKTA_CLIENT_ID} clientSecret: ${AUTH_OKTA_CLIENT_SECRET} audience: ${AUTH_OKTA_AUDIENCE}在 ConfigClusterLocator.ts 中,后端通过clusterConfig.getOptionalString('oidcTokenProvider')读取该字段,并将其映射为集群元数据注解ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER(即kubernetes.io/oidc-token-provider)。
方式二:通过 catalog 注解配置
当使用catalog集群定位器时,需要在kubernetes-cluster类型的 Resource 实体上添加注解。注解常量定义在 catalog-entity-constants.ts:
export const ANNOTATION_KUBERNETES_OIDC_TOKEN_PROVIDER = 'kubernetes.io/oidc-token-provider';对应的实体示例如下(完整示例见 configuration.md):
apiVersion: backstage.io/v1alpha1 kind: Resource metadata: name: my-cluster annotations: kubernetes.io/api-server: 'https://my-cluster.example.com' kubernetes.io/api-server-certificate-authority: # base64 编码的 CA kubernetes.io/auth-provider: 'oidc' kubernetes.io/oidc-token-provider: 'microsoft' kubernetes.io/skip-metrics-lookup: 'true' spec: type: kubernetes-cluster owner: user:guest前端配合:oidc provider 注册与请求体注入
前端插件plugin-kubernetes(0.6.5-next.3)同步升级以配合后端新策略。前端通过KubernetesAuthProviders(见 KubernetesAuthProviders.ts)在构造时注册oidcProviders,把认证提供方(OpenIdConnectApi)映射为oidc.<provider>形式的认证策略:
if (options.oidcProviders) { Object.keys(options.oidcProviders).forEach(provider => { this.authProviders[`oidc.${provider}`] = new OidcKubernetesAuthProvider( `oidc.${provider}`, options.oidcProviders![provider], ); }); }实际请求时,OidcKubernetesAuthProvider(见 OidcKubernetesAuthProvider.ts)会调用getBackstageIdentityResponse之类的认证 API 获取 ID Token,并将其写入请求体的auth.oidc.<provider>字段。对应测试(KubernetesAuthProviders.test.ts)验证了oidc.okta的 token 注入结果{ auth: { oidc: { okta: 'oktaToken' } } }。
此外,前端会在请求头中携带 provider 信息:KubernetesBackendClient(见 KubernetesBackendClient.ts)对于oidc认证会将请求头拼接为Backstage-Kubernetes-Authorization-oidc-okta格式,便于后端进行代理转发鉴权(测试用例见 KubernetesBackendClient.test.ts)。
使用前提与限制
- 集群必须支持 OIDC:这是硬性前提。官方文档明确指出,截至文档编写时 AKS 集群尚不支持 OIDC(见 configuration.md 中
authProvider取值表对oidc的说明); - 前端开箱即用的 provider:
gitlab(需在认证应用中授予openidscope)、google、microsoft、okta、onelogin; oidcTokenProvider本质是 token 的签发方(issuer):例如完全可以用microsoft作为 EKS 集群的 token 签发方,provider 名称与集群云厂商无关;- 与
serviceAccount策略相比,OIDC 方案避免了在配置中存储长期有效的 Service Account Token,更适合需要用户级身份区分与凭证轮换的场景。
核心变更二:core-components 前端组件修复与无障碍改进
@backstage/core-components@0.9.4-next.2包含三项独立变更,均为视觉与可访问性(a11y)层面的打磨:
1. Avatar 组件:有图片时不再强制设置背景色
变更52c02ac02b:当 Avatar 组件带有图片(picture)时,不再设置背景色。这是典型的视觉回归修复——此前有头像图片的元素也会被渲染背景色,可能导致图片周围出现色块。升级后仅对无图片的 Avatar 保留背景色用于占位展示。
2. OAuthRequestDialog:ARIA 语义完善
变更3603014e0e:为 OAuth 请求对话框(OAuthRequestDialog)添加了 ARIA landmark(<main>)、label 和标题(heading),并移除了嵌套的可交互控件(button)。这项改进对使用屏幕阅读器的用户意义重大:对话框现在有明确的语义区域与可读标题,同时消除了"按钮嵌套按钮"这类违反 HTML 规范、会导致辅助技术误读的结构问题。
3. Sidebar 子菜单与 SidebarPage 修复
变更2025d7c123是一组侧边栏相关问题修复,同样影响plugin-org(见下文):
- 正确高亮
SidebarSubmenuItem下拉项在 hover 时的状态; SidebarSubmenu中较长的标签使用省略号(ellipsis)样式,避免文本溢出;SidebarSubmenuItem的icon和to属性改为可选;- 修复
SidebarPage的 padding,使其能响应侧边栏的固定(pinned)状态,避免内容布局抖动。
由于plugin-home、plugin-org、plugin-scaffolder、plugin-techdocs等插件均依赖core-components,此版本的依赖升级会随Updated dependencies一并带入这些插件(详见各自变更条目中的依赖列表)。
核心变更三:home 与 org 插件增强
plugin-home:StarredEntities 卡片显示实体标题
@backstage/plugin-home@0.4.21-next.3的变更69093c5f91:主页"星标实体"(StarredEntities)卡片在实体定义了标题(title)时显示标题,并且不再展示已不存在的实体(例如从 catalog 中被删除的实体)。
这一改进直接提升了主页信息质量:此前卡片只显示metadata.name,对带有友好标题的实体不够直观;同时旧版本可能在列表中残留已删除实体,造成点击后跳转到失效详情页的体验问题。
plugin-org:MyGroupSidebarItem 命名空间与多组路由修复
@backstage/plugin-org@0.5.5-next.3的变更同样归属于2025d7c123:MyGroupSidebarItem在用户所属组不在默认命名空间时,会在侧边栏项中包含命名空间;同时当用户属于多个组时,移除根项(root item)路由,避免多个组的入口都映射到同一路由导致冲突。
该变更与core-components的SidebarSubmenuItem修复同属侧边栏体系的一次整体打磨,升级时建议将两个包一并更新,保证 API 行为一致。
核心变更四:scaffolder 与 techdocs 依赖版本回退
@backstage/plugin-scaffolder@1.2.0-next.3与@backstage/plugin-techdocs@1.1.1-next.3共享同一变更cc8ddd0979:将依赖event-source-polyfill回退到1.0.25。
event-source-polyfill是用于在浏览器中模拟 Server-Sent Events(SSE)的 polyfill 库,scaffolder 的任务日志流式输出与 techdocs 的构建状态推送均依赖该机制。回退到1.0.25通常意味着此前升级到的新版本存在回归问题(如事件流中断、连接异常),属于典型的"升级后发现兼容问题而回退"的工程决策。对于使用这两个插件的用户,此变更基本透明,无需额外配置;若此前手动升级过该依赖,建议与插件版本保持一致。
升级与验证建议
- 按依赖图整体升级:
core-components处于依赖链上游,plugin-home、plugin-org、plugin-scaffolder、plugin-techdocs都通过Updated dependencies引用它,升级时建议使用 Backstage 官方推荐的backstage-cli versions:bump流程保持各包版本一致; - 若启用 Kubernetes OIDC 认证:同时升级
plugin-kubernetes、plugin-kubernetes-backend、plugin-kubernetes-common三个包(它们由同一变更引入),并按上文配置authProvider: oidc与oidcTokenProvider,确保auth.providers中对应 provider 已启用且授予了openidscope; - 验证路径:配置完成后,可在 catalog 实体页打开 Kubernetes 面板,观察 Pod 等资源是否成功返回;后端日志若出现
Must specify a token provider for 'oidc' strategy,说明集群缺少oidcTokenProvider配置;若出现Auth token not found under oidc.<provider> in request body,说明前端 provider 注册与后端配置不一致; - 预发布版本说明:
next系列为发布候选版本,建议在非生产环境先行验证,确认无回归后再等待正式版v1.2.0发布后升级。
小结
v1.2.0-next.3 虽以 Patch 级变更为主,但 Kubernetes 插件的 OIDC 认证支持是架构层面的一次能力扩充:后端通过OidcStrategy将 ID Token 转换为 Bearer Token 访问集群,前端通过oidcProviders注册机制完成 token 获取与注入,配置侧同时覆盖config与catalog两种集群来源。其余变更集中在侧边栏交互、无障碍语义、主页实体展示与依赖版本治理上,均为低风险的体验优化。开发者在升级时可重点关注 OIDC 相关配置项,即可平滑完成版本过渡。
【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考