diff --git a/packages/core/src/baseCogniteClient.ts b/packages/core/src/baseCogniteClient.ts index e02ebcba2c..92cc0069e2 100644 --- a/packages/core/src/baseCogniteClient.ts +++ b/packages/core/src/baseCogniteClient.ts @@ -81,12 +81,17 @@ export type OIDC_AUTHORIZATION_CODE_FLOW = { type: 'OIDC_AUTHORIZATION_CODE_FLOW'; options: OAuthLoginForOIDCAuthFlowOptions; }; +export type CUSTOM = { + type: 'CUSTOM'; + options: unknown; +}; export type AuthFlowType = | AAD_OAUTH | CDF_OAUTH | ADFS_OAUTH - | OIDC_AUTHORIZATION_CODE_FLOW; + | OIDC_AUTHORIZATION_CODE_FLOW + | CUSTOM; /** * @deprecated @@ -365,6 +370,42 @@ export default class BaseCogniteClient { return token !== null; }; + public async loginWithCustom( + fn: ( + callbacks: { + setCluster: (s: string) => void; + setBearerToken: (s: string) => void; + validateAccessToken: (s: string) => Promise; + } + ) => Promise + ): Promise { + if (this.hasBeenLoggedIn) { + throwReLogginError(); + } + + this.flow = { type: 'CUSTOM', options: {} }; + + const [authenticate, token] = await fn({ + setCluster: this.httpClient.setCluster, + setBearerToken: this.httpClient.setBearerToken, + validateAccessToken: this.validateAccessToken, + }); + + this.httpClient.set401ResponseHandler(async (_, retry, reject) => { + const didAuthenticate = await authenticate(); + return didAuthenticate ? retry() : reject(); + }); + + if (token) { + this.httpClient.setBearerToken(token); + } + + this.authenticate = authenticate; + this.hasBeenLoggedIn = true; + + return token !== null; + } + /** * To modify the base-url at any point in time */ @@ -898,7 +939,7 @@ export default class BaseCogniteClient { } } - protected async validateAccessToken(token: string): Promise { + protected validateAccessToken = async (token: string): Promise => { try { const response = await this.httpClient.get( `/api/${this.apiVersion}/token/inspect`, @@ -917,7 +958,7 @@ export default class BaseCogniteClient { throw err; } - } + }; } export type BaseRequestOptions = HttpRequestOptions; diff --git a/packages/core/src/httpClient/basicHttpClient.ts b/packages/core/src/httpClient/basicHttpClient.ts index ffe2d8e0e5..0242525ecd 100644 --- a/packages/core/src/httpClient/basicHttpClient.ts +++ b/packages/core/src/httpClient/basicHttpClient.ts @@ -104,9 +104,9 @@ export class BasicHttpClient { return this.baseUrl; } - public setCluster(cluster: string) { + public setCluster = (cluster: string) => { this.baseUrl = `https://${cluster}.${DEFAULT_DOMAIN}`; - } + }; public get(path: string, options: HttpRequestOptions = {}) { return this.request({ diff --git a/packages/core/src/httpClient/cdfHttpClient.ts b/packages/core/src/httpClient/cdfHttpClient.ts index f120d8a56e..7fca7abfeb 100644 --- a/packages/core/src/httpClient/cdfHttpClient.ts +++ b/packages/core/src/httpClient/cdfHttpClient.ts @@ -68,9 +68,9 @@ export class CDFHttpClient extends RetryableHttpClient { return this; } - public setBearerToken(token: string) { + public setBearerToken = (token: string) => { this.setDefaultHeader(AUTHORIZATION_HEADER, bearerString(token)); - } + }; public set401ResponseHandler(handler: Response401Handler) { this.response401Handler = handler;