From eccb7e1cb8b0d25c835beaa2b111c266e57f218d Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 20 May 2020 12:12:19 +0200 Subject: [PATCH] packages/core: rename AuthHelper to AuthConnector --- .../implementations/auth/google/GoogleAuth.ts | 6 +++--- .../DefaultAuthConnector.test.ts} | 14 +++++++------- .../DefaultAuthConnector.ts} | 9 ++++++++- .../MockAuthConnector.test.ts} | 6 +++--- .../MockAuthConnector.ts} | 4 ++-- .../lib/{AuthHelper => AuthConnector}/index.ts | 2 +- .../lib/{AuthHelper => AuthConnector}/types.ts | 6 +++++- .../RefreshingAuthSessionManager.test.ts | 12 ++++++------ .../RefreshingAuthSessionManager.ts | 16 ++++++++-------- 9 files changed, 43 insertions(+), 32 deletions(-) rename packages/core/src/api/apis/implementations/lib/{AuthHelper/AuthHelper.test.ts => AuthConnector/DefaultAuthConnector.test.ts} (90%) rename packages/core/src/api/apis/implementations/lib/{AuthHelper/AuthHelper.ts => AuthConnector/DefaultAuthConnector.ts} (93%) rename packages/core/src/api/apis/implementations/lib/{AuthHelper/MockAuthHelper.test.ts => AuthConnector/MockAuthConnector.test.ts} (86%) rename packages/core/src/api/apis/implementations/lib/{AuthHelper/MockAuthHelper.ts => AuthConnector/MockAuthConnector.ts} (89%) rename packages/core/src/api/apis/implementations/lib/{AuthHelper => AuthConnector}/index.ts (90%) rename packages/core/src/api/apis/implementations/lib/{AuthHelper => AuthConnector}/types.ts (80%) diff --git a/packages/core/src/api/apis/implementations/auth/google/GoogleAuth.ts b/packages/core/src/api/apis/implementations/auth/google/GoogleAuth.ts index 0b32db2023..599ce789db 100644 --- a/packages/core/src/api/apis/implementations/auth/google/GoogleAuth.ts +++ b/packages/core/src/api/apis/implementations/auth/google/GoogleAuth.ts @@ -15,7 +15,7 @@ */ import GoogleIcon from '@material-ui/icons/AcUnit'; -import { AuthHelper } from '../../lib/AuthHelper'; +import { DefaultAuthConnector } from '../../lib/AuthConnector'; import { GoogleSession } from './types'; import { OAuthApi, @@ -37,7 +37,7 @@ const SCOPE_PREFIX = 'https://www.googleapis.com/auth/'; class GoogleAuth implements OAuthApi, OpenIdConnectApi { static create(oauthRequestApi: OAuthRequestApi) { - const helper = new AuthHelper({ + const connector = new DefaultAuthConnector({ providerPath: 'google/', environment: 'dev', provider: { @@ -56,7 +56,7 @@ class GoogleAuth implements OAuthApi, OpenIdConnectApi { }); const sessionManager = new RefreshingAuthSessionManager({ - helper, + connector, defaultScopes: new Set([ 'openid', `${SCOPE_PREFIX}userinfo.email`, diff --git a/packages/core/src/api/apis/implementations/lib/AuthHelper/AuthHelper.test.ts b/packages/core/src/api/apis/implementations/lib/AuthConnector/DefaultAuthConnector.test.ts similarity index 90% rename from packages/core/src/api/apis/implementations/lib/AuthHelper/AuthHelper.test.ts rename to packages/core/src/api/apis/implementations/lib/AuthConnector/DefaultAuthConnector.test.ts index d62226679d..4ea3bde015 100644 --- a/packages/core/src/api/apis/implementations/lib/AuthHelper/AuthHelper.test.ts +++ b/packages/core/src/api/apis/implementations/lib/AuthConnector/DefaultAuthConnector.test.ts @@ -15,7 +15,7 @@ */ import ProviderIcon from '@material-ui/icons/AcUnit'; -import { AuthHelper } from './AuthHelper'; +import { DefaultAuthConnector } from './DefaultAuthConnector'; import MockOAuthApi from '../../OAuthRequestManager/MockOAuthApi'; import * as loginPopup from '../loginPopup'; @@ -37,7 +37,7 @@ const defaultOptions = { }), }; -describe('AuthHelper', () => { +describe('DefaultAuthConnector', () => { afterEach(() => { jest.resetAllMocks(); anyFetch.resetMocks(); @@ -53,7 +53,7 @@ describe('AuthHelper', () => { }), ); - const helper = new AuthHelper(defaultOptions); + const helper = new DefaultAuthConnector(defaultOptions); const session = await helper.refreshSession(); expect(session.idToken).toBe('mock-id-token'); expect(session.accessToken).toBe('mock-access-token'); @@ -65,7 +65,7 @@ describe('AuthHelper', () => { it('should handle failure to refresh session', async () => { anyFetch.mockRejectOnce(new Error('Network NOPE')); - const helper = new AuthHelper(defaultOptions); + const helper = new DefaultAuthConnector(defaultOptions); await expect(helper.refreshSession()).rejects.toThrow( 'Auth refresh request failed, Error: Network NOPE', ); @@ -74,7 +74,7 @@ describe('AuthHelper', () => { it('should handle failure response when refreshing session', async () => { anyFetch.mockResponseOnce({}, { status: 401, statusText: 'NOPE' }); - const helper = new AuthHelper(defaultOptions); + const helper = new DefaultAuthConnector(defaultOptions); await expect(helper.refreshSession()).rejects.toThrow( 'Auth refresh request failed with status NOPE', ); @@ -82,7 +82,7 @@ describe('AuthHelper', () => { it('should fail if popup was rejected', async () => { const mockOauth = new MockOAuthApi(); - const helper = new AuthHelper({ + const helper = new DefaultAuthConnector({ ...defaultOptions, oauthRequestApi: mockOauth, }); @@ -101,7 +101,7 @@ describe('AuthHelper', () => { scopes: 'a b', expiresInSeconds: 3600, }); - const helper = new AuthHelper({ + const helper = new DefaultAuthConnector({ ...defaultOptions, oauthRequestApi: mockOauth, }); diff --git a/packages/core/src/api/apis/implementations/lib/AuthHelper/AuthHelper.ts b/packages/core/src/api/apis/implementations/lib/AuthConnector/DefaultAuthConnector.ts similarity index 93% rename from packages/core/src/api/apis/implementations/lib/AuthHelper/AuthHelper.ts rename to packages/core/src/api/apis/implementations/lib/AuthConnector/DefaultAuthConnector.ts index d855c17076..bad8ac948b 100644 --- a/packages/core/src/api/apis/implementations/lib/AuthHelper/AuthHelper.ts +++ b/packages/core/src/api/apis/implementations/lib/AuthConnector/DefaultAuthConnector.ts @@ -17,6 +17,7 @@ import { AuthRequester } from '../../..'; import { OAuthRequestApi, AuthProvider } from '../../../definitions'; import { showLoginPopup } from '../loginPopup'; +import { AuthConnector } from './types'; const DEFAULT_BASE_PATH = '/api/auth/'; @@ -30,7 +31,13 @@ type Options = { sessionTransform?(response: any): AuthSession | Promise; }; -export class AuthHelper implements AuthHelper { +/** + * DefaultAuthConnector is the default auth connector in Backstage. It talks to the + * backend auth plugin through the standardized API, and requests user permission + * via the OAuthRequestApi. + */ +export class DefaultAuthConnector + implements AuthConnector { private readonly apiOrigin: string; private readonly basePath: string; private readonly providerPath: string; diff --git a/packages/core/src/api/apis/implementations/lib/AuthHelper/MockAuthHelper.test.ts b/packages/core/src/api/apis/implementations/lib/AuthConnector/MockAuthConnector.test.ts similarity index 86% rename from packages/core/src/api/apis/implementations/lib/AuthHelper/MockAuthHelper.test.ts rename to packages/core/src/api/apis/implementations/lib/AuthConnector/MockAuthConnector.test.ts index 0cb1e13163..cd7986ffd0 100644 --- a/packages/core/src/api/apis/implementations/lib/AuthHelper/MockAuthHelper.test.ts +++ b/packages/core/src/api/apis/implementations/lib/AuthConnector/MockAuthConnector.test.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import MockAuthHelper, { mockAccessToken } from './MockAuthHelper'; +import { MockAuthConnector, mockAccessToken } from './MockAuthConnector'; -describe('MockAuthHelper', () => { +describe('MockAuthConnector', () => { it('should return mock tokens', async () => { - const helper = new MockAuthHelper(); + const helper = new MockAuthConnector(); await expect(helper.createSession()).resolves.toEqual({ accessToken: mockAccessToken, diff --git a/packages/core/src/api/apis/implementations/lib/AuthHelper/MockAuthHelper.ts b/packages/core/src/api/apis/implementations/lib/AuthConnector/MockAuthConnector.ts similarity index 89% rename from packages/core/src/api/apis/implementations/lib/AuthHelper/MockAuthHelper.ts rename to packages/core/src/api/apis/implementations/lib/AuthConnector/MockAuthConnector.ts index e793ebd047..50f045671a 100644 --- a/packages/core/src/api/apis/implementations/lib/AuthHelper/MockAuthHelper.ts +++ b/packages/core/src/api/apis/implementations/lib/AuthConnector/MockAuthConnector.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { GenericAuthHelper } from './types'; +import { AuthConnector } from './types'; export const mockAccessToken = 'mock-access-token'; @@ -30,7 +30,7 @@ const defaultMockSession: MockSession = { scopes: 'profile email', }; -export default class MockAuthHelper implements GenericAuthHelper { +export class MockAuthConnector implements AuthConnector { constructor(private readonly mockSession: MockSession = defaultMockSession) {} async refreshSession() { diff --git a/packages/core/src/api/apis/implementations/lib/AuthHelper/index.ts b/packages/core/src/api/apis/implementations/lib/AuthConnector/index.ts similarity index 90% rename from packages/core/src/api/apis/implementations/lib/AuthHelper/index.ts rename to packages/core/src/api/apis/implementations/lib/AuthConnector/index.ts index e472ca06de..db5c582328 100644 --- a/packages/core/src/api/apis/implementations/lib/AuthHelper/index.ts +++ b/packages/core/src/api/apis/implementations/lib/AuthConnector/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { AuthHelper } from './AuthHelper'; +export { DefaultAuthConnector } from './DefaultAuthConnector'; export * from './types'; diff --git a/packages/core/src/api/apis/implementations/lib/AuthHelper/types.ts b/packages/core/src/api/apis/implementations/lib/AuthConnector/types.ts similarity index 80% rename from packages/core/src/api/apis/implementations/lib/AuthHelper/types.ts rename to packages/core/src/api/apis/implementations/lib/AuthConnector/types.ts index b9ccae11c8..86858a90e5 100644 --- a/packages/core/src/api/apis/implementations/lib/AuthHelper/types.ts +++ b/packages/core/src/api/apis/implementations/lib/AuthConnector/types.ts @@ -19,7 +19,11 @@ export type BaseAuthSession = { expiresAt: Date; }; -export type GenericAuthHelper = { +/** + * An AuthConnector is responsible for realizing auth session actions + * by for example communicating with a backend or interacting with the user. + */ +export type AuthConnector = { refreshSession(): Promise; removeSession(): Promise; createSession(scopes: Set): Promise; diff --git a/packages/core/src/api/apis/implementations/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts b/packages/core/src/api/apis/implementations/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts index 511f860f75..fb56b9e62d 100644 --- a/packages/core/src/api/apis/implementations/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts +++ b/packages/core/src/api/apis/implementations/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts @@ -24,7 +24,7 @@ describe('RefreshingAuthSessionManager', () => { const createSession = jest.fn().mockResolvedValue({ expiresAt: theFuture }); const refreshSession = jest.fn().mockRejectedValue(new Error('NOPE')); const manager = new RefreshingAuthSessionManager({ - helper: { createSession, refreshSession }, + connector: { createSession, refreshSession }, } as any); await manager.getSession({}); @@ -40,7 +40,7 @@ describe('RefreshingAuthSessionManager', () => { const createSession = jest.fn(); const refreshSession = jest.fn().mockRejectedValue(new Error('NOPE')); const manager = new RefreshingAuthSessionManager({ - helper: { createSession, refreshSession }, + connector: { createSession, refreshSession }, } as any); createSession.mockResolvedValue({ @@ -64,7 +64,7 @@ describe('RefreshingAuthSessionManager', () => { .mockRejectedValueOnce(new Error('NOPE')) .mockResolvedValue({ scopes: new Set(['a']) }); const manager = new RefreshingAuthSessionManager({ - helper: { createSession, refreshSession }, + connector: { createSession, refreshSession }, } as any); createSession.mockResolvedValue({ @@ -85,7 +85,7 @@ describe('RefreshingAuthSessionManager', () => { const createSession = jest.fn(); const refreshSession = jest.fn().mockRejectedValue(new Error('NOPE')); const manager = new RefreshingAuthSessionManager({ - helper: { createSession, refreshSession }, + connector: { createSession, refreshSession }, } as any); createSession.mockRejectedValueOnce(new Error('some error')); @@ -98,7 +98,7 @@ describe('RefreshingAuthSessionManager', () => { const createSession = jest.fn(); const refreshSession = jest.fn().mockRejectedValue(new Error('NOPE')); const manager = new RefreshingAuthSessionManager({ - helper: { createSession, refreshSession }, + connector: { createSession, refreshSession }, } as any); expect(await manager.getSession({ optional: true })).toBe(undefined); @@ -118,7 +118,7 @@ describe('RefreshingAuthSessionManager', () => { const removeSession = jest.fn(); const manager = new RefreshingAuthSessionManager({ - helper: { removeSession }, + connector: { removeSession }, } as any); await manager.removeSession(); diff --git a/packages/core/src/api/apis/implementations/lib/AuthSessionManager/RefreshingAuthSessionManager.ts b/packages/core/src/api/apis/implementations/lib/AuthSessionManager/RefreshingAuthSessionManager.ts index 5670a0f7df..fbbb95a1eb 100644 --- a/packages/core/src/api/apis/implementations/lib/AuthSessionManager/RefreshingAuthSessionManager.ts +++ b/packages/core/src/api/apis/implementations/lib/AuthSessionManager/RefreshingAuthSessionManager.ts @@ -16,10 +16,10 @@ import { hasScopes } from '../../OAuthRequestManager/OAuthPendingRequests'; import { SessionManager } from './types'; -import { BaseAuthSession, GenericAuthHelper } from '../AuthHelper'; +import { BaseAuthSession, AuthConnector } from '../AuthConnector'; type Options = { - helper: GenericAuthHelper; + connector: AuthConnector; defaultScopes?: Set; }; @@ -29,16 +29,16 @@ type Options = { */ export class RefreshingAuthSessionManager implements SessionManager { - private readonly helper: GenericAuthHelper; + private readonly connector: AuthConnector; private readonly defaultScopes?: Set; private refreshPromise?: Promise; private currentSession: AuthSession | undefined; constructor(options: Options) { - const { helper, defaultScopes = new Set() } = options; + const { connector, defaultScopes = new Set() } = options; - this.helper = helper; + this.connector = connector; this.defaultScopes = defaultScopes; } @@ -92,14 +92,14 @@ export class RefreshingAuthSessionManager } // We can call authRequester multiple times, the returned session will contain all requested scopes. - this.currentSession = await this.helper.createSession( + this.currentSession = await this.connector.createSession( this.getExtendedScope(options.scope), ); return this.currentSession; } async removeSession() { - await this.helper.removeSession(); + await this.connector.removeSession(); window.location.reload(); // TODO(Rugvip): make this work without reload? } @@ -141,7 +141,7 @@ export class RefreshingAuthSessionManager return this.refreshPromise; } - this.refreshPromise = this.helper.refreshSession(); + this.refreshPromise = this.connector.refreshSession(); try { return await this.refreshPromise;