diff --git a/docs/api/classes/modules_signer.SignerService.md b/docs/api/classes/modules_signer.SignerService.md index 143b5bb9..41d2025c 100644 --- a/docs/api/classes/modules_signer.SignerService.md +++ b/docs/api/classes/modules_signer.SignerService.md @@ -416,7 +416,7 @@ ___ ### publicKeyAndIdentityToken -▸ **publicKeyAndIdentityToken**(): `Promise`<[`IPubKeyAndIdentityToken`](../interfaces/modules_signer.IPubKeyAndIdentityToken.md)\> +▸ **publicKeyAndIdentityToken**(`force?`): `Promise`<[`IPubKeyAndIdentityToken`](../interfaces/modules_signer.IPubKeyAndIdentityToken.md)\> Generate public key and identity token for authentication purposes. @@ -424,6 +424,12 @@ Generate public key and identity token for authentication purposes. signerService.publicKeyAndIdentityToken(); ``` +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `force` | `boolean` | `false` | when true recalculates token even if it is already present | + #### Returns `Promise`<[`IPubKeyAndIdentityToken`](../interfaces/modules_signer.IPubKeyAndIdentityToken.md)\> diff --git a/docs/api/interfaces/modules_cache_client.AuthTokens.md b/docs/api/interfaces/modules_cache_client.AuthTokens.md new file mode 100644 index 00000000..cb2bcdd9 --- /dev/null +++ b/docs/api/interfaces/modules_cache_client.AuthTokens.md @@ -0,0 +1,22 @@ +# Interface: AuthTokens + +[modules/cache-client](../modules/modules_cache_client.md).AuthTokens + +## Table of contents + +### Properties + +- [refreshToken](modules_cache_client.AuthTokens.md#refreshtoken) +- [token](modules_cache_client.AuthTokens.md#token) + +## Properties + +### refreshToken + +• **refreshToken**: `string` + +___ + +### token + +• **token**: `string` diff --git a/docs/api/interfaces/modules_did_registry.GetDIDDocumentOptions.md b/docs/api/interfaces/modules_did_registry.GetDIDDocumentOptions.md index 7f083a18..3bc7aace 100644 --- a/docs/api/interfaces/modules_did_registry.GetDIDDocumentOptions.md +++ b/docs/api/interfaces/modules_did_registry.GetDIDDocumentOptions.md @@ -13,7 +13,7 @@ ### did -• **did**: `string` +• `Optional` **did**: `string` ___ diff --git a/docs/api/interfaces/modules_did_registry.GetDidDelegatesOptions.md b/docs/api/interfaces/modules_did_registry.GetDidDelegatesOptions.md index d8ff8c84..866fda8c 100644 --- a/docs/api/interfaces/modules_did_registry.GetDidDelegatesOptions.md +++ b/docs/api/interfaces/modules_did_registry.GetDidDelegatesOptions.md @@ -12,4 +12,4 @@ ### did -• **did**: `string` +• `Optional` **did**: `string` diff --git a/docs/api/interfaces/modules_did_registry.GetDidPublicKeysOptions.md b/docs/api/interfaces/modules_did_registry.GetDidPublicKeysOptions.md index be98c0a1..3235bf91 100644 --- a/docs/api/interfaces/modules_did_registry.GetDidPublicKeysOptions.md +++ b/docs/api/interfaces/modules_did_registry.GetDidPublicKeysOptions.md @@ -12,4 +12,4 @@ ### did -• **did**: `string` +• `Optional` **did**: `string` diff --git a/docs/api/interfaces/modules_did_registry.GetServicesOptions.md b/docs/api/interfaces/modules_did_registry.GetServicesOptions.md index 097d6ecb..4d89dabf 100644 --- a/docs/api/interfaces/modules_did_registry.GetServicesOptions.md +++ b/docs/api/interfaces/modules_did_registry.GetServicesOptions.md @@ -12,4 +12,4 @@ ### did -• **did**: `string` +• `Optional` **did**: `string` diff --git a/docs/api/modules/modules_cache_client.md b/docs/api/modules/modules_cache_client.md index 0c799179..61005b74 100644 --- a/docs/api/modules/modules_cache_client.md +++ b/docs/api/modules/modules_cache_client.md @@ -13,6 +13,7 @@ ### Interfaces +- [AuthTokens](../interfaces/modules_cache_client.AuthTokens.md) - [CacheServerClientOptions](../interfaces/modules_cache_client.CacheServerClientOptions.md) - [ICacheClient](../interfaces/modules_cache_client.ICacheClient.md) diff --git a/src/modules/cache-client/cache-client.service.ts b/src/modules/cache-client/cache-client.service.ts index cb9777e9..d007860f 100644 --- a/src/modules/cache-client/cache-client.service.ts +++ b/src/modules/cache-client/cache-client.service.ts @@ -21,6 +21,7 @@ import { cacheConfigs } from '../../config/cache.config'; import { ICacheClient } from './cache-client.interface'; import { AssetsFilter, + AuthTokens, ClaimsFilter, TEST_LOGIN_ENDPOINT, } from './cache-client.types'; @@ -63,44 +64,43 @@ export class CacheClient implements ICacheClient { * After authentication runs previously failed requests */ async authenticate() { + let tokens: AuthTokens | undefined = undefined; + + // First try to refresh access token try { const refreshedTokens = await this.refreshToken(); - if (refreshedTokens) { - getLogger().debug('[CACHE CLIENT] Setting authorization tokens'); - if (!this.isBrowser) { - this._httpClient.defaults.headers.common[ - 'Authorization' - ] = `Bearer ${refreshedTokens.token}`; - } - if (await this.isAuthenticated()) { - this.refresh_token = refreshedTokens.refreshToken; - return; - } + if (refreshedTokens && (await this.isAuthenticated())) { + tokens = refreshedTokens; } - } catch (error) { - getLogger().error('[CACHE CLIENT] Authentication failed'); - getLogger().error(error); + } catch { + getLogger().error('[CACHE CLIENT] Failed to refresh tokens'); } - const pubKeyAndIdentityToken = - await this._signerService.publicKeyAndIdentityToken(); - const { - data: { refreshToken, token }, - } = await this._httpClient.post<{ token: string; refreshToken: string }>( - '/login', - { + // If refresh token failed or access token is not valid, then sign new identity token + if (!tokens) { + delete this._httpClient.defaults.headers.common['Authorization']; + const pubKeyAndIdentityToken = + await this._signerService.publicKeyAndIdentityToken(true); + const { data } = await this._httpClient.post('/login', { identityToken: pubKeyAndIdentityToken.identityToken, - } - ); + }); + this.pubKeyAndIdentityToken = pubKeyAndIdentityToken; + tokens = data; + } + + // Set new tokens if (!this.isBrowser) { this._httpClient.defaults.headers.common[ 'Authorization' - ] = `Bearer ${token}`; + ] = `Bearer ${tokens.token}`; } - this.refresh_token = refreshToken; - this.pubKeyAndIdentityToken = pubKeyAndIdentityToken; + this.refresh_token = tokens.refreshToken; + // Run previously failed requests + console.log( + `[CACHE CLIENT] Running failed requests: ${this.failedRequests.length}` + ); this.failedRequests = this.failedRequests.filter((callback) => callback()); } @@ -113,13 +113,9 @@ export class CacheClient implements ICacheClient { */ async handleError(error: AxiosError) { getLogger().debug(`[CACHE CLIENT] Axios error: ${error.message}`); - getLogger().error(error); const { config, response } = error; const originalRequest = config; - getLogger().debug(config); - getLogger().debug(response); - if ( this.authEnabled && response && @@ -130,9 +126,18 @@ export class CacheClient implements ICacheClient { config.url?.indexOf(TEST_LOGIN_ENDPOINT) === -1 ) { getLogger().debug(`[CACHE CLIENT] axios error unauthorized`); - const retryOriginalRequest = new Promise((resolve) => { + const retryOriginalRequest = new Promise((resolve, reject) => { this.failedRequests.push(() => { - resolve(axios(originalRequest)); + axios({ + ...originalRequest, + headers: { + ...originalRequest.headers, + Authorization: + this._httpClient.defaults.headers.common['Authorization'], + }, + }) + .then(resolve) + .catch(reject); }); }); if (!this.isAuthenticating) { @@ -405,13 +410,7 @@ export class CacheClient implements ICacheClient { return data; } - private async refreshToken(): Promise< - | { - token: string; - refreshToken: string; - } - | undefined - > { + private async refreshToken(): Promise { getLogger().debug('[CACHE CLIENT] Refreshing token'); if (!this.refresh_token) return undefined; diff --git a/src/modules/cache-client/cache-client.types.ts b/src/modules/cache-client/cache-client.types.ts index 4eb6f5bf..26dcded1 100644 --- a/src/modules/cache-client/cache-client.types.ts +++ b/src/modules/cache-client/cache-client.types.ts @@ -29,3 +29,8 @@ export enum SearchType { } export const TEST_LOGIN_ENDPOINT = '/auth/status'; + +export interface AuthTokens { + token: string; + refreshToken: string; +} diff --git a/src/modules/did-registry/did.types.ts b/src/modules/did-registry/did.types.ts index 06573871..bf9cf2bc 100644 --- a/src/modules/did-registry/did.types.ts +++ b/src/modules/did-registry/did.types.ts @@ -32,7 +32,7 @@ export interface ClaimData extends Record { export interface GetDIDDocumentOptions { /* DID of the user */ - did: string; + did?: string; /* Indicates resolving claims object */ includeClaims?: boolean; diff --git a/src/modules/signer/signer.service.ts b/src/modules/signer/signer.service.ts index bfb8ea41..13820f9e 100644 --- a/src/modules/signer/signer.service.ts +++ b/src/modules/signer/signer.service.ts @@ -442,11 +442,13 @@ export class SignerService { * ```typescript * signerService.publicKeyAndIdentityToken(); * ``` - * + * @param force when true recalculates token even if it is already present * @return object with public key and identity token */ - async publicKeyAndIdentityToken(): Promise { - if (!this._publicKey || !this._identityToken) { + async publicKeyAndIdentityToken( + force = false + ): Promise { + if (!this._publicKey || !this._identityToken || force) { await this._calculatePubKeyAndIdentityToken(); } return {