在 Backstage 中启用公共入口点:将未认证登录页与受保护主应用拆分的实验特性实战
在 Backstage 中启用公共入口点将未认证登录页与受保护主应用拆分的实验特性实战【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage导读本文围绕 Backstage 官方教程《Enabling a public entry point实验特性》展开讲解如何把 Backstage 应用打包产物拆分为仅含登录页的公共入口与登录后可见的受保护主入口并借助app-backend插件按认证状态分发不同入口。读完本文你将掌握index-public-experimental.tsx的编写约定、新前端系统下的最小实现、本地验证流程以及app-backend在源码层面是如何完成未认证用户看公共页、已认证用户看主应用这一分发逻辑的。本文面向新的前端系统Backstage 新应用默认启用。如果你的应用仍在使用旧前端系统请阅读旧前端系统版本的教程。特性原理一份应用两个入口该特性的核心思路是把应用打包产物bundle拆成两个代码入口公共入口点public entry point只包含登录页sign-in pages相关代码受保护主入口点protected main entry point包含登录后看到的主应用全部代码。随后Backstage 的 CLI 与后端会检测到公共入口点的存在对未认证用户返回公共入口登录页对已认证用户才返回受保护的主入口。换句话说主应用的index.html不会在未认证状态下被直接交付给浏览器从而把主应用主体真正保护起来。从源码结构看这一检测与分发能力由app-backend插件承担详见下文后端源码解析一节。当前该特性仍处于实验阶段官方预期会在后续迭代中继续打磨因此文中方案属于简化的可用版本。前置要求启用公共入口点需要满足两个条件缺一不可应用必须由app-backend插件提供服务否则该特性不生效例如用静态文件服务器直接托管dist目录的场景不适用必须使用backstage-cli来构建build与服务serveBackstage 应用即采用标准的yarn workspace app start/yarn backstage-cli app:build流程。分步实现编写公共入口文件第 1 步创建index-public-experimental.tsx在应用包的src目录下新建文件以仓库内置应用为例即packages/app/src/index-public-experimental.tsximport ReactDOM from react-dom/client; import { signInPageModule } from ./overrides/SignInPage; import { appModulePublicSignIn } from backstage/plugin-app/alpha; import { createApp } from backstage/frontend-defaults; const app createApp({ features: [signInPageModule, appModulePublicSignIn], }); ReactDOM.createRoot(document.getElementById(root)!).render( app.createRoot(), );需要特别注意的是文件名index-public-experimental.tsx是一种约定convention当前版本不可配置。CLI 会在打包时识别该约定文件将其构建为独立的公共入口若文件名不同则不会被识别。第 2 步理解两个关键模块signInPageModule你自己的自定义登录页扩展通常已经在应用中配置好。在这个公共入口里它就是未认证用户能看到的所有内容。appModulePublicSignIn来自backstage/plugin-app/alpha它提供了CookieAuthRedirect组件负责在登录完成后发起已认证重定向把用户带回主应用。从源码实现看见 plugins/app/src/alpha/appModulePublicSignIn.tsxappModulePublicSignIn会通过createFrontendModule以app为插件 ID 注册扩展并覆盖app/layout扩展用内部的InternalCookieAuthRedirect替换默认布局。这意味着公共入口会忽略大多数常规应用安装的扩展例如导航、主页等布局类扩展只保留 API 与根元素类扩展因此典型配置就是只装一个自定义登录页。InternalCookieAuthRedirect的工作流程是登录后从identityApi获取 Backstage token然后渲染一个隐藏表单以POST方式把typesign-in与token提交到当前 URLwindow.location.href由后端完成 cookie 签发后重定向回主应用。另外官方在文档中特别说明前端会自动处理 cookie 的刷新cookie refreshing无需你额外关心。本地验证从项目根目录执行以下两条命令分别构建/启动应用与后端# 构建并启动 app 包开发模式 yarn workspace app start # 启动后端 API yarn start-backend随后访问 http://localhost:7007 验证打开页面检查返回的index.html响应——它应当只包含一个极简应用即公共入口只有登录页相关代码点击登录并完成认证后你将被重定向到主应用首页此时在开发者工具中检查网络请求可以看到重定向后受保护的主 bundle 是从app-backend返回的。官方同时给出一个重要说明常规的应用服务regular app serving始终会不经认证地提供受保护应用——也就是说只有配置了公共入口点构建产物中存在public目录时app-backend才会启用受保护模式的分发逻辑。后端源码解析app-backend如何分发两个入口该特性的后端核心逻辑位于 plugins/app-backend/src/service/router.ts。从源码可以看到完整的分发链路1. 检测公共入口目录。插件会计算publicDistDir resolvePath(appDistDir, public)即打包产物dist下是否存在public子目录由index-public-experimental.tsx构建产生。只有当public目录存在且配置未禁用时才进入受保护模式const disablePublicEntryPoint config.getOptionalBoolean( app.disablePublicEntryPoint, ); const enablePublicEntryPoint !disablePublicEntryPoint (await fs.pathExists(publicDistDir));2. 认证分流中间件。公共路由会先通过httpAuth.credentials(req, { allow: [user, service, none], allowLimitedAccess: true })解析请求凭据若credentials.principal.type none未认证继续走公共入口路由返回登录页否则已认证next(router)跳过公共路由交给外层主入口路由处理。3. 登录回传POST sign-in。公共路由对POST *请求启用express.urlencoded解析当请求体type sign-in时用auth.authenticate(req.body.token)校验 token确认是user主体后通过httpAuth.issueUserCookie签发用户 cookie然后把请求方法改写为GET并next(router)交由受保护的主入口路由正常返回主应用index.html。4. 静态资源与缓存。公共入口与主入口分别通过createEntryPointRouter提供服务公共入口的静态资源缓存使用独立的assetStore.withNamespace(public)命名空间避免与主入口资产相互污染。配置项app.disablePublicEntryPoint如果你虽然构建了公共入口但希望临时关闭该行为例如回退到始终返回主入口可以在app-config.yaml中设置app: disablePublicEntryPoint: true该配置项定义于 plugins/app-backend/config.d.ts当应用带有index-public-experimental入口时app-backend默认会自动把它提供给未认证用户设为true后则跳过该行为始终提供主入口。该开关在app-backend的 CHANGELOG 中也有记录可作为版本升级时的参考。测试用例佐证app-backend的单元测试plugins/app-backend/src/service/router.test.ts完整覆盖了上述三条核心行为可作为理解与回归验证的依据serves the public entry point to unauthenticated users未携带 cookie 请求/index.html返回公共入口的public index.html状态码 200serves the main entry point to authenticated users携带用户 cookie 请求/index.html返回主入口的index.htmlhandles sign-in and issues a user cookiePOST /提交typesign-in与有效 token 后响应包含set-cookie头且最终返回主入口index.htmlrejects POST requests without a sign-in type提交非sign-in类型的 POST 请求会被拒绝。旧前端系统说明与限制若应用仍运行在旧前端系统上公共入口的实现方式不同它使用backstage/app-defaults的createApp、backstage/core-components的SignInPage/AlertDisplay/OAuthRequestDialog以及backstage/plugin-auth-react的CookieAuthRedirect并需显式装配AppRouter。具体代码与说明见旧版教程。最后提醒三点使用限制公共入口点特性依赖app-backend与backstage-cli的配合脱离任一条件均不生效文件名index-public-experimental.tsx为硬编码约定暂不支持自定义该特性仍处于实验阶段官方表示会在后续迭代中继续完善生产环境采用前请评估其稳定性与安全边界。【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

从零搭建AI伴侣:大模型提示词与记忆层设计实践

从零搭建AI伴侣:大模型提示词与记忆层设计实践

那个晚上我本来只是想在睡觉前试一个最近很火的AI角色聊天应用,结果一聊就是三个小时。界面里那个虚拟形象确实很漂亮,回复也快,语气温柔到不像话。但我在关掉屏幕的一瞬间突然产生一种说不出的失落感:她好像什么都能聊&#xff0…

2026/9/14 20:03:58 阅读更多 →
NocoBase CLI `nb app autostart list` 命令详解:查看 env 应用自启动状态

NocoBase CLI `nb app autostart list` 命令详解:查看 env 应用自启动状态

NocoBase CLI nb app autostart list 命令详解:查看 env 应用自启动状态 【免费下载链接】nocobase NocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of pr…

2026/9/15 21:17:04 阅读更多 →
3 个策略修复 res-downloader 下载失败卡 99%:分片下载机制与终极排障指南

3 个策略修复 res-downloader 下载失败卡 99%:分片下载机制与终极排障指南

3 个策略修复 res-downloader 下载失败卡 99%:分片下载机制与终极排障指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloa…

2026/9/16 0:51:20 阅读更多 →

最新新闻

EIP-7778 深度解析:无退款的区块 Gas 记账机制如何堵住区块 Gas 上限的绕过漏洞

EIP-7778 深度解析:无退款的区块 Gas 记账机制如何堵住区块 Gas 上限的绕过漏洞

EIP-7778 深度解析:无退款的区块 Gas 记账机制如何堵住区块 Gas 上限的绕过漏洞 【免费下载链接】EIPs The Ethereum Improvement Proposal repository 项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs 导读 EIP-7778(Block Gas Account…

2026/9/16 1:26:45 阅读更多 →
Calico Node Init:CrashLoopBackOff 排查实战:从日志到修复

Calico Node Init:CrashLoopBackOff 排查实战:从日志到修复

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

2026/9/16 1:26:45 阅读更多 →
Velero 仓库组织迁移实施全解析:从 Heptio 迁移到 VMware Tanzu 的 GitHub 仓库搬迁计划

Velero 仓库组织迁移实施全解析:从 Heptio 迁移到 VMware Tanzu 的 GitHub 仓库搬迁计划

Velero 仓库组织迁移实施全解析:从 Heptio 迁移到 VMware Tanzu 的 GitHub 仓库搬迁计划 【免费下载链接】velero Backup and migrate Kubernetes applications and their persistent volumes 项目地址: https://gitcode.com/GitHub_Trending/ve/velero 导读&…

2026/9/16 1:26:45 阅读更多 →
Matlab HRV特征提取工具箱:从RR间期到非线性指标的全流程解析

Matlab HRV特征提取工具箱:从RR间期到非线性指标的全流程解析

简介:Matlab环境下的HRV(心率变异性)特征提取与非线性计算工具包,面向生物医学工程、运动生理学及心理学领域的研究人员和学生,用于从心电信号中提取RR间期并计算多种HRV指标。资源核心围绕非线性动力学分析展开&#…

2026/9/16 1:26:45 阅读更多 →
AGV无线通信方案对比:从nRF24L01到工业WiFi的选型与部署

AGV无线通信方案对比:从nRF24L01到工业WiFi的选型与部署

AGV这行干久了你会发现,真正让项目从“能跑”变成“跑得稳”的,往往不是底盘、不是电机、甚至不是调度算法,而是那条看不见的无线链路。AGV无线通信听起来是个基础话题,实际上牵扯到整车的控制闭环、多车调度、场地上位机交互&…

2026/9/16 1:26:45 阅读更多 →
51单片机PWM调速实战:从定时器模拟到PID闭环

51单片机PWM调速实战:从定时器模拟到PID闭环

简介:基于51单片机控制PWM直流电机调速的完整源代码,面向电子工程、自动化控制及嵌入式入门学习者,主要解决直流电机调速中PWM占空比调节、定时器配置与中断控制等关键问题。压缩包共含19个文件,以Keil工程文件(.uvpro…

2026/9/16 1:25:44 阅读更多 →

日新闻

嵌入式三大高薪赛道:车规功能安全、RISC-V固件架构、边缘AI部署

嵌入式三大高薪赛道:车规功能安全、RISC-V固件架构、边缘AI部署

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

2026/9/16 0:00:51 阅读更多 →
IoT-For-Beginners 智能语音计时器:Wio Terminal 基于 DMAC 与 Flash 的音频采集实战

IoT-For-Beginners 智能语音计时器:Wio Terminal 基于 DMAC 与 Flash 的音频采集实战

IoT-For-Beginners 智能语音计时器:Wio Terminal 基于 DMAC 与 Flash 的音频采集实战 【免费下载链接】IoT-For-Beginners 12 Weeks, 24 Lessons, IoT for All! 项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners 本指南聚焦 GitHub Tren…

2026/9/16 0:01:52 阅读更多 →
基于MATLAB的CRI显色指数计算:从SPD光谱到Ra的完整流程

基于MATLAB的CRI显色指数计算:从SPD光谱到Ra的完整流程

简介:针对照明设计与光学研究中的光谱功率分布(SPD)与显色性指数(CRI)计算需求,这套MATLAB程序为照明工程师、LED研发人员及光学专业学生提供了轻量工具。代码通过解析光谱测量数据,自动完成波长…

2026/9/16 0:01:52 阅读更多 →

周新闻

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/15 12:27:42 阅读更多 →
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/15 1:32:25 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

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

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

2026/9/15 1:32:21 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/15 21:40:17 阅读更多 →