From 1e0230e30494d1a63be9efa2b0b45eb08916d465 Mon Sep 17 00:00:00 2001 From: Gasan Guseinov Date: Thu, 5 Dec 2024 19:15:43 +0100 Subject: [PATCH] custom AuthConnector for OAuth2 Signed-off-by: Gasan Guseinov --- .changeset/brave-pandas-beam.md | 5 ++ .../implementations/auth/oauth2/OAuth2.ts | 47 ++++++++++++++----- packages/core-app-api/src/index.ts | 4 ++ 3 files changed, 43 insertions(+), 13 deletions(-) create mode 100644 .changeset/brave-pandas-beam.md diff --git a/.changeset/brave-pandas-beam.md b/.changeset/brave-pandas-beam.md new file mode 100644 index 0000000000..3defff8aa6 --- /dev/null +++ b/.changeset/brave-pandas-beam.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-app-api': patch +--- + +custom AuthConnector for OAuth2 diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts index 4963330724..9162896ebe 100644 --- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts +++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts @@ -15,6 +15,7 @@ */ import { + AuthConnector, DefaultAuthConnector, PopupOptions, } from '../../../../lib/AuthConnector'; @@ -43,6 +44,9 @@ import { OAuthApiCreateOptions } from '../types'; export type OAuth2CreateOptions = OAuthApiCreateOptions & { scopeTransform?: (scopes: string[]) => string[]; popupOptions?: PopupOptions; + authConnectorFactory?: ( + opts: OAuth2CreateOptions, + ) => AuthConnector; }; export type OAuth2Response = { @@ -79,23 +83,22 @@ export default class OAuth2 BackstageIdentityApi, SessionApi { - static create(options: OAuth2CreateOptions) { + private static createDefaultAuthConnector(options: OAuth2CreateOptions) { const { - configApi, - discoveryApi, - environment = 'development', - provider = DEFAULT_PROVIDER, - oauthRequestApi, - defaultScopes = [], - scopeTransform = x => x, - popupOptions, - } = options; - - const connector = new DefaultAuthConnector({ configApi, discoveryApi, environment, provider, + oauthRequestApi, + scopeTransform, + popupOptions, + } = options; + + return new DefaultAuthConnector({ + configApi, + discoveryApi, + environment: environment!, + provider: provider!, oauthRequestApi: oauthRequestApi, sessionTransform({ backstageIdentity, @@ -107,7 +110,7 @@ export default class OAuth2 idToken: res.providerInfo.idToken, accessToken: res.providerInfo.accessToken, scopes: OAuth2.normalizeScopes( - scopeTransform, + scopeTransform!, res.providerInfo.scope, ), expiresAt: res.providerInfo.expiresInSeconds @@ -128,6 +131,24 @@ export default class OAuth2 }, popupOptions, }); + } + + static create(options: OAuth2CreateOptions) { + const { + environment = 'development', + provider = DEFAULT_PROVIDER, + defaultScopes = [], + scopeTransform = x => x, + authConnectorFactory = (opts: OAuth2CreateOptions) => + OAuth2.createDefaultAuthConnector(opts), + } = options; + + const connector = authConnectorFactory({ + ...options, + scopeTransform, + environment, + provider, + }); const sessionManager = new RefreshingAuthSessionManager({ connector, diff --git a/packages/core-app-api/src/index.ts b/packages/core-app-api/src/index.ts index a5e6b649e9..9033622b9d 100644 --- a/packages/core-app-api/src/index.ts +++ b/packages/core-app-api/src/index.ts @@ -23,3 +23,7 @@ export * from './apis'; export * from './app'; export * from './routing'; +export type { AuthConnector } from './lib'; +export type { CreateSessionOptions } from './lib'; +export { showLoginPopup } from './lib'; +export type { LoginPopupOptions } from './lib';