ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Backstage 集成 Microsoft Azure 认证提供商:App Registration 配置、OAuth 登录与用户身份解析实战指南

Backstage 集成 Microsoft Azure 认证提供商:App Registration 配置、OAuth 登录与用户身份解析实战指南 Backstage 集成 Microsoft Azure 认证提供商App Registration 配置、OAuth 登录与用户身份解析实战指南【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage本指南基于 Backstage 官方文档 docs/auth/microsoft/provider.md 展开并结合仓库内plugins/auth-backend-module-microsoft-provider模块的源码实现进行深度解读。你将掌握在 Azure 门户完成 App Registration 的完整配置、在app-config.yaml中接入 Microsoft OAuth 提供商、通过 Sign-in Resolver 将登录用户解析为 Catalog 中的 User 实体以及把登录入口接入 Backstage 前端与后端的完整落地流程。认证提供商概览一条从 OAuth 到用户身份的完整链路Backstage 的core-plugin-api包内置了 Microsoft 认证提供商Microsoft authentication provider它基于 Azure OAuthMicrosoft Entra ID / Azure AD完成用户认证。其能力链路大致分为三层前端通过microsoftAuthApiRef定义于 packages/core-plugin-api/src/apis/definitions/auth.ts发起登录请求并持有会话后端由backstage/plugin-auth-backend-module-microsoft-provider模块实现 OAuth 授权码交换、Token 刷新、用户资料拉取等核心逻辑身份解析通过 Sign-in Resolver 将 Microsoft 返回的用户信息邮箱或用户 ID与软件目录Software Catalog中的 User 实体关联从而完成 Backstage 身份建立。该模块基于 passport-microsoft 策略扩展而来全部源码位于 plugins/auth-backend-module-microsoft-provider可在动手配置前先通读其 README.md 了解模块定位。第一步在 Azure 门户配置 App Registration整个集成的起点是 Azure 侧的应用注册。根据公司安全策略的严格程度部分步骤可能需要目录管理员directory administrator协助完成。进入 Azure 门户的App registrations页面找到已有的应用注册或新建一个。若已存在用于 Backstage 的 App Registration应优先复用而非重复创建。添加 Web 平台配置在应用注册的 Overview 页面新增一个Web平台配置参数如下Redirect URIhttps://your-backstage.com/api/auth/microsoft/handler/frame本地开发环境通常为http://localhost:7007/api/auth/microsoft/handler/frameFront-channel logout Url留空Implicit grant and hybrid flows全部不勾选Backstage 使用标准的授权码流程不需要隐式流。Redirect URI 的/handler/frame路径是 Backstage 内部约定的 OAuth 回调端点前端登录页会通过隐藏 iframe 完成回跳因此该路径必须严格保持。配置 API 权限在API permissions标签页点击Add Permission为Microsoft GraphAPI 添加以下Delegated委托权限emailoffline_accessopenidprofileUser.Read可选在app-config.yaml中定义的 Microsoft Graph API 自定义作用域custom scopes管理员同意Admin Consent公司可能强制要求为这些权限授予管理员同意。即使没有强制要求也建议执行这样用户首次访问 Backstage 时无需逐人单独同意授权弹窗。授予方式是由目录管理员在该页面点击Grant admin consent for COMPANY NAME按钮。创建客户端密钥Client Secret若复用已有的应用注册且 Backstage 已有 client secret可直接复用。否则进入Certificates Secrets页面下的Client secrets标签页新建一个客户端密钥并妥善记录该值——下一步配置app-config.yaml时需要用到。第二步出站网络访问要求如果运行环境对出站流量有限制例如防火墙规则请确保 Backstage 后端能够访问以下主机主机用途login.microsoftonline.com获取和交换授权码与访问令牌authorization codes / access tokensgraph.microsoft.com拉取用户资料信息调用https://graph.microsoft.com/v1.0/me/及头像接口若graph.microsoft.com不可达用户登录时可能看到Authentication failed, failed to fetch user profile错误。从源码看这一依赖体现在两处passport-microsoft策略在 OAuth 回调后调用 Graph 获取fullProfile仓库自定义的ExtendedMicrosoftStrategystrategy.ts还会额外请求https://graph.microsoft.com/v1.0/me/photos/96x96/$value拉取用户头像并以 base64 Data URL 形式写入profile.photos。第三步app-config.yaml 配置在app-config.yaml根级auth配置下添加提供商配置auth: environment: development providers: microsoft: development: clientId: ${AZURE_CLIENT_ID} clientSecret: ${AZURE_CLIENT_SECRET} tenantId: ${AZURE_TENANT_ID} domainHint: ${AZURE_TENANT_ID} signIn: resolvers: # 更多 resolver 参见下方 Resolvers 小节 - resolver: userIdMatchingUserEntityAnnotation注意结构为auth.providers.microsoft.环境名其中环境名如development、production须与auth.environment匹配。完整的配置 Schema 定义在 plugins/auth-backend-module-microsoft-provider/config.d.ts其中clientSecret标注为visibility secretmicrosoft整个配置块标注为visibility frontend仅clientId等非敏感项会暴露给前端。配置项说明配置项必填说明clientId是应用客户端ID位于 App Registration OverviewclientSecret是客户端密钥位于 App Registration Certificates secretstenantId是目录租户ID位于 App Registration OverviewdomainHint否通常与tenantId相同多租户应用注册请留空。指定后可通过 Home Realm Discovery 自动过滤掉其他租户的账户减少多租户环境用户的登录摩擦additionalScopes否需要在必需作用域之外追加请求的应用注册作用域支持字符串或字符串数组skipUserProfile否为true时跳过用户资料加载即使存在User.Read作用域并禁用为获取非 Graph 资源 Token 而单独发起的 Graph 调用。适用于仅需emailOAuth2 作用域提供spec.profile.email的 resolver属于性能优化项sessionDuration否用户会话的生命周期HumanDuration 或字符串形式callbackUrl否回调 URL缺省时由框架根据后端地址自动推导见 config.d.ts配置项的源码级解析在 authenticator.ts 的initialize中上述配置被逐一读取并注入 OAuth 策略clientId、clientSecret、tenantId分别映射为 passport-microsoft 策略的clientID、clientSecret、tenantdomainHint与skipUserProfile被单独保存在上下文中供start阶段与 profile 处理阶段使用skipUserProfile通过strategy.setSkipUserProfile(skipUserProfile)传递给自定义策略。在start阶段authenticator.ts当配置了domainHint时授权 URL 会追加domain_hint参数并始终携带accessTypeoffline对应offline_access作用域用于获取刷新令牌。测试用例 authenticator.test.ts 验证了最终重定向到https://login.microsoftonline.com/tenantId/oauth2/v2.0/authorize的完整 URL 拼装。作用域请求的底层逻辑模块对 OAuth 作用域做了特殊处理authenticator.ts必需作用域email、openid、offline_access、user.read当请求的作用域中包含资源型作用域形如resource/scope例如 Azure 管理 API 或 AKS 的aks-audience/user.read时只转发请求作用域外加offline_access避免混入 Graph 作用域导致 Token 无效。第四步配置 Sign-in Resolvers 解析用户身份Microsoft 提供商内置了多个开箱即用的 Sign-in Resolver用于把认证结果映射到 Catalog 中的 User 实体emailMatchingUserEntityProfileEmail用提供商的邮箱匹配spec.profile.email与 User 实体一致的记录未命中抛出NotFoundErroremailLocalPartMatchingUserEntityName用邮箱的本地部分之前的字符串匹配 User 实体的name未命中抛出NotFoundErroremailMatchingUserEntityAnnotation用提供商邮箱匹配 User 实体上microsoft.com/email注解的值未命中抛出NotFoundErroruserIdMatchingUserEntityAnnotation用提供商返回的用户资料 ID 匹配 User 实体上graph.microsoft.com/user-id注解的值未命中抛出NotFoundError。该 resolver 推荐用于解决部分用户资料中没有邮箱的场景。:::note 多个 resolver 会按配置顺序依次尝试但只有在抛出NotFoundError时才会被跳过、尝试下一个。 :::源码印证Resolver 的具体实现emailMatchingUserEntityAnnotation与userIdMatchingUserEntityAnnotation实现在 resolvers.ts前者使用ctx.signInWithCatalogUser({ annotations: { microsoft.com/email: profile.email } })后者使用graph.microsoft.com/user-id: id作为注解键两个 resolver 均支持dangerouslyAllowSignInWithoutUserInCatalog选项当用户在 Catalog 中不存在时允许以临时实体entityRef fallback完成登录resolvers.tsresolver 的完整注册发生在 module.tsmicrosoftSignInResolvers与commonSignInResolvers合并后注册到createOAuthProviderFactory在app-config.yaml的signIn.resolvers中引用 resolver 名即可Schema 支持的 resolver 及其可选参数如emailLocalPartMatchingUserEntityName的allowedDomains见 config.d.ts。如果这些内置 resolver 无法满足需求可参考 Sign-in Identities and Resolvers 文档中的 Building Custom Resolvers 一节构建自定义 resolver。第五步后端安装与注册在 Backstage 根目录执行以下命令安装后端模块包yarn --cwd packages/backend add backstage/plugin-auth-backend-module-microsoft-provider然后在 packages/backend/src/index.ts 中注册该模块backend.add(import(backstage/plugin-auth-backend)); /* highlight-add-start */ backend.add(import(backstage/plugin-auth-backend-module-microsoft-provider)); /* highlight-add-end */从源码结构看该模块通过createBackendModule注册module.ts声明pluginId: auth、moduleId: microsoft-provider并在初始化时通过authProvidersExtensionPoint注册providerId: microsoft的提供商工厂与app-config.yaml中的auth.providers.microsoft键一一对应。第六步将提供商加入前端登录页将提供商加入前端登录页需要引入microsoftAuthApiRef引用与SignInPage组件完整的前端 Sign-In 配置方法参见 Adding the provider to the sign-in page 一节。核心要点如下登录由自定义SignInPage应用组件驱动它会在应用其他路由渲染之前完成用户身份建立并通过onSignInSuccess回调把身份交给 Backstage官方SignInPage组件来自backstage/core-components接受provider单个或providers数组属性值为SignInProviderConfig定义将示例中的githubAuthApiRef替换为microsoftAuthApiRef、id改为microsoft-auth-provider、标题改为 Microsoft 即可适配示例代码位于 docs/auth/index.md使用providers数组可以同时启用多种登录方式例如允许 guest 访问但此时需保证各提供商的 Sign-in Resolver 解析到同一身份如需无弹窗的重定向登录流程可在app-config.yaml根部添加enableExperimentalRedirectFlow: true。源码原理深剖Profile 获取与性能优化Graph 作用域检测与头像拉取ExtendedMicrosoftStrategystrategy.ts在父类基础上做了两处增强作用域感知的 Profile 跳过hasGraphReadScope会解码访问令牌的 JWTaud为00000003-0000-0000-c000-000000000000即 Microsoft Graph且scp包含User.Read/User.Read.All来判断令牌是否可用于 Graph若令牌面向非 Graph 资源或配置了skipUserProfile则跳过 profile 加载头像补充当 profile 无photos时额外调用 Graph 的me/photos/96x96/$value获取头像并转为data:image/jpeg;base64,...失败时静默忽略返回undefined不影响登录主流程。非 Graph 场景下的二次刷新取 Profile当一个访问令牌面向非 Graph 资源例如 Azure Management API时它无法用于拉取 Graph 用户资料。此时withProfileFetchedViaGraphauthenticator.ts会利用 Microsoft 刷新令牌“与资源无关”的特性——同一个刷新令牌可以换取不同资源的访问令牌——以openid email User.Read offline_access作用域发起一次额外的刷新调用获取 Graph 令牌和完整 profile同时保留原始结果中的访问令牌。该逻辑在authenticate与refresh两个阶段均生效且会把第一次调用轮换出的新刷新令牌继续传递给第二次调用。测试验证的行为契约authenticator.test.ts 通过 MSW 模拟login.microsoftonline.com与graph.microsoft.com端点验证了以下关键行为登录/刷新后返回包含邮箱、显示名与头像 base64 数据的完整 profileL168-L183使用非 Graph 作用域登录时会通过 Graph 作用域二次刷新补全 profile但保留原访问令牌L185-L202未授予刷新令牌时非 Graph 场景下不返回 profileL204-L215头像接口异常时优雅降级profile 中省略 photosL230-L251skipUserProfile: true时跳过 profile 加载、仅返回访问令牌L341-L363刷新流程会把第一次调用轮换出的刷新令牌链入后续 Graph profile 调用L296-L339。这些测试用例同时是排查线上登录问题的绝佳参考若出现 Authentication failed, failed to fetch user profile可优先检查graph.microsoft.com连通性、User.Read作用域是否在授权结果中以及是否误配置了skipUserProfile。常见问题排查要点现象排查方向Authentication failed, failed to fetch user profile检查后端出站到graph.microsoft.com的网络策略确认User.Read委托权限已授予登录后无法识别用户检查signIn.resolvers顺序与所选 resolver 的注解键microsoft.com/email或graph.microsoft.com/user-id是否与 Catalog User 实体中的注解一致多租户用户登录摩擦大为单租户应用注册配置domainHint多租户注册则保持其留空令牌面向非 Graph 资源时登录失败确认offline_access已授权刷新令牌是二次取 profile 的前提登录流程无响应核对 Redirect URI 是否严格等于https://your-backstage/api/auth/microsoft/handler/frame以及auth.providers.microsoft.env的env是否与auth.environment匹配至此从 Azure 门户配置、网络放行、后端/前端接入到身份解析的 Microsoft Azure 认证提供商全链路已完成配置。若需在受约束的企业网络中进一步排查或扩展例如对接自定义 LDAP/IdP 或调整会话时长可继续阅读 Backstage 认证文档 与 Identity Resolver 文档。【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表