@ascentgl/ads-identity 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,41 +1,29 @@
1
- import { HttpErrorResponse, HttpClient, provideHttpClient, withInterceptors } from '@angular/common/http';
2
- import { throwError, of, catchError, map, switchMap } from 'rxjs';
3
1
  import * as i0 from '@angular/core';
4
- import { InjectionToken, inject, Injectable, Injector } from '@angular/core';
2
+ import { InjectionToken, computed, signal, inject, Injectable, Injector } from '@angular/core';
3
+ import { of, throwError, catchError, map, switchMap } from 'rxjs';
5
4
  import { jwtDecode, InvalidTokenError } from 'jwt-decode';
5
+ import { HttpErrorResponse, HttpClient, provideHttpClient, withInterceptors } from '@angular/common/http';
6
6
  import { Router } from '@angular/router';
7
7
 
8
8
  class LogHelper {
9
- static { this.prefix = 'ADS-IDENTITY:'; }
9
+ static { this.prefix = 'ADS-IDENTITY'; }
10
10
  static log(...args) {
11
- if (this.options?.debugMode)
12
- console.log(...args);
13
- }
14
- static warn(...args) {
15
- if (this.options?.debugMode)
16
- console.warn(...args);
17
- }
18
- static groupStart(...data) {
19
- if (this.options?.debugMode)
20
- console.group(this.prefix, ...data);
21
- }
22
- static groupEnd() {
23
- if (this.options?.debugMode)
24
- console.groupEnd();
11
+ if (!this.options?.debugMode)
12
+ return;
13
+ console.group(this.prefix, 'TOKEN UPDATE');
14
+ console.log(...args);
15
+ console.groupEnd();
25
16
  }
26
17
  static error(...args) {
27
- if (this.options?.debugMode)
28
- console.error(...args);
18
+ if (!this.options?.debugMode)
19
+ return;
20
+ console.group(this.prefix, 'EXCEPTION');
21
+ console.error(...args);
22
+ console.groupEnd();
29
23
  }
30
24
  }
31
25
 
32
26
  class ErrorHelper {
33
- static { this.throw = (error) => {
34
- return throwError(() => {
35
- LogHelper.groupEnd();
36
- return error;
37
- });
38
- }; }
39
27
  static extractMessage(error) {
40
28
  if (typeof error === 'string') {
41
29
  return error;
@@ -96,27 +84,43 @@ const IDENTITY_OPTIONS = new InjectionToken('IDENTITY_OPTIONS');
96
84
 
97
85
  class TokenService {
98
86
  constructor() {
99
- this.accessToken = null;
100
- this.refreshToken = null;
87
+ this.readonlyAccessToken = computed(() => this.accessToken());
88
+ this.readonlyRefreshToken = computed(() => this.refreshToken());
89
+ this.accessToken = signal(null);
90
+ this.refreshToken = signal(null);
101
91
  this.options = inject(IDENTITY_OPTIONS);
102
92
  }
103
93
  setAccessToken(token) {
104
- return this.accessToken = this.setToken("IDMS_AccessToken", token);
105
- }
106
- setRefreshToken(token) {
107
- return this.refreshToken = this.setToken("IDMS_RefreshToken", token);
94
+ return this.updateAccessTokenSignal(this.setToken("IDMS_AccessToken", token));
108
95
  }
109
96
  getAccessToken() {
110
- return this.accessToken = this.getToken("IDMS_AccessToken", this.accessToken?.token);
97
+ return this.updateAccessTokenSignal(this.getToken("IDMS_AccessToken", this.accessToken()?.token));
98
+ }
99
+ setRefreshToken(token) {
100
+ return this.updateRefreshTokenSignal(this.setToken("IDMS_RefreshToken", token));
111
101
  }
112
102
  getRefreshToken() {
113
- return this.refreshToken = this.getToken("IDMS_RefreshToken", this.refreshToken?.token);
103
+ return this.updateRefreshTokenSignal(this.getToken("IDMS_RefreshToken", this.refreshToken()?.token));
104
+ }
105
+ updateAccessTokenSignal(newToken) {
106
+ if (this.accessToken()?.token === newToken?.token) {
107
+ return this.accessToken();
108
+ }
109
+ this.accessToken.set(newToken);
110
+ return this.logToken("IDMS_AccessToken", newToken);
111
+ }
112
+ updateRefreshTokenSignal(newToken) {
113
+ if (this.refreshToken()?.token === newToken?.token) {
114
+ return this.refreshToken();
115
+ }
116
+ this.refreshToken.set(newToken);
117
+ return this.logToken("IDMS_RefreshToken", newToken);
114
118
  }
115
119
  setToken(key, token) {
116
120
  if (typeof token !== 'string') {
117
121
  throw new InvalidTokenError(`Provided ${key} value is not a string`);
118
122
  }
119
- const identityToken = this.wrapToken(key, token, true);
123
+ const identityToken = this.wrapToken(token, true);
120
124
  if (identityToken) {
121
125
  localStorage.setItem(key, token);
122
126
  }
@@ -125,20 +129,17 @@ class TokenService {
125
129
  getToken(key, token) {
126
130
  const actualToken = token ?? localStorage.getItem(key) ?? null;
127
131
  if (typeof actualToken === 'string') {
128
- return this.wrapToken(key, actualToken, false);
132
+ return this.wrapToken(actualToken, false);
129
133
  }
130
- LogHelper.log(key, 'not provided and not found in Local Storage');
131
134
  return null;
132
135
  }
133
- wrapToken(key, token, throwError) {
136
+ wrapToken(token, throwError) {
134
137
  try {
135
138
  const payload = TokenHelper.getPayload(token, {
136
139
  iss: this.options.backendUrl + '/api',
137
140
  sub: this.options.application
138
141
  }, 10);
139
- const identityToken = { token, payload: payload };
140
- LogHelper.log(key, identityToken);
141
- return identityToken;
142
+ return { token, payload: payload };
142
143
  }
143
144
  catch (error) {
144
145
  if (throwError) {
@@ -148,6 +149,10 @@ class TokenService {
148
149
  return null;
149
150
  }
150
151
  }
152
+ logToken(key, token) {
153
+ LogHelper.log(key, token);
154
+ return token;
155
+ }
151
156
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TokenService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
152
157
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TokenService, providedIn: 'root' }); }
153
158
  }
@@ -158,45 +163,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImpor
158
163
 
159
164
  class IdentityService {
160
165
  constructor() {
166
+ this.accessToken = computed(() => this.tokenService.readonlyAccessToken());
167
+ this.refreshToken = computed(() => this.tokenService.readonlyRefreshToken());
161
168
  this.tokenService = inject(TokenService);
162
169
  this.httpClient = inject(HttpClient);
163
170
  this.options = inject(IDENTITY_OPTIONS);
164
171
  }
165
- isAuthenticated(caller) {
166
- LogHelper.groupStart(`Verifying access token for ${caller}`);
172
+ isAuthenticated() {
167
173
  const accessToken = this.tokenService.getAccessToken();
174
+ const refreshToken = this.tokenService.getRefreshToken();
168
175
  if (accessToken) {
169
- LogHelper.groupEnd();
170
176
  return of(accessToken);
171
177
  }
172
- LogHelper.groupEnd();
173
- LogHelper.groupStart(`Getting refresh token for ${caller}`);
174
- if (this.tokenService.getRefreshToken()) {
175
- LogHelper.groupEnd();
176
- return this.refreshTokens(caller);
178
+ if (refreshToken) {
179
+ return this.refreshTokens();
177
180
  }
178
- return ErrorHelper.throw(new InvalidTokenError('No valid tokens found'));
181
+ return throwError(() => new InvalidTokenError('No valid tokens found'));
179
182
  }
180
- refreshTokens(caller) {
181
- LogHelper.groupStart(`Refreshing tokens for ${caller}`);
183
+ refreshTokens() {
182
184
  const refreshToken = this.tokenService.getRefreshToken();
183
185
  if (!refreshToken) {
184
- return ErrorHelper.throw(new InvalidTokenError('No refresh token found'));
186
+ return throwError(() => new InvalidTokenError('No refresh token found'));
185
187
  }
186
- const endpoint = `${this.options.backendUrl}/api/v${this.options.apiVersion ?? 1}/refresh-token`;
187
- LogHelper.log(`Calling ${endpoint} to get new tokens`);
188
188
  return this.httpClient
189
- .get(endpoint, {
189
+ .get(`${this.options.backendUrl}/api/v${this.options.apiVersion ?? 1}/refresh-token`, {
190
190
  headers: { 'Authorization': `Bearer ${refreshToken.token}` }
191
191
  })
192
192
  .pipe(catchError((error) => {
193
193
  LogHelper.error(new InvalidTokenError(`Failed to obtain tokens. Reason: ${ErrorHelper.extractMessage(error).toLowerCase()}`));
194
- return ErrorHelper.throw(error);
194
+ return throwError(() => error);
195
195
  }), map((response) => {
196
196
  const accessToken = this.tokenService.setAccessToken(response.access_token);
197
197
  this.tokenService.setRefreshToken(response.refresh_token);
198
198
  if (accessToken) {
199
- LogHelper.groupEnd();
200
199
  return accessToken;
201
200
  }
202
201
  throw new InvalidTokenError('Could not set access token');
@@ -210,6 +209,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImpor
210
209
  args: [{ providedIn: 'root' }]
211
210
  }] });
212
211
 
212
+ const IDENTITY_AUTH_GUARD = (_route, state) => {
213
+ const identityService = inject(IdentityService);
214
+ const options = inject(IDENTITY_OPTIONS);
215
+ return identityService.isAuthenticated().pipe(catchError((error) => {
216
+ window.location.href = `${options.frontendUrl}/apps/${options.application}?redirect=true&redirect_path=${encodeURIComponent(state.url)}`;
217
+ LogHelper.error(error);
218
+ return of(null);
219
+ }), map((accessToken) => !!accessToken));
220
+ };
221
+
222
+ const IDENTITY_AUTH_CALLBACK_GUARD = (route) => {
223
+ const router = inject(Router);
224
+ const tokenService = inject(TokenService);
225
+ try {
226
+ tokenService.setAccessToken(route.queryParams['access_token']);
227
+ tokenService.setRefreshToken(route.queryParams['refresh_token']);
228
+ return router.navigateByUrl(route.queryParams['redirect_path'] || '/');
229
+ }
230
+ catch (error) {
231
+ const routerOutlet = document.body.querySelector('router-outlet');
232
+ if (routerOutlet) {
233
+ routerOutlet.innerHTML = ErrorHelper.extractMessage(error);
234
+ }
235
+ LogHelper.error(error);
236
+ return false;
237
+ }
238
+ };
239
+
213
240
  class RequestHelper {
214
241
  static isIdentityEndpointRequest(request) {
215
242
  return request.url.startsWith(this.options?.backendUrl ?? '');
@@ -227,7 +254,6 @@ class RequestHelper {
227
254
  }
228
255
  static onAuthorizationError(error, injector) {
229
256
  if (this.options?.onAuthorizationError) {
230
- console.log('BOO');
231
257
  this.options?.onAuthorizationError(error, injector);
232
258
  }
233
259
  return throwError(() => error);
@@ -242,7 +268,7 @@ function requestInterceptor(request, next) {
242
268
  !RequestHelper.isAuthorizedRequest(request)) {
243
269
  return next(request);
244
270
  }
245
- return identityService.isAuthenticated(`Request Interceptor (${request.url})`).pipe(catchError((error) => RequestHelper.onAuthorizationError(error, injector)), switchMap(accessToken => next(RequestHelper.attachAuthorizationHeader(request, accessToken))));
271
+ return identityService.isAuthenticated().pipe(catchError((error) => RequestHelper.onAuthorizationError(error, injector)), switchMap(accessToken => next(RequestHelper.attachAuthorizationHeader(request, accessToken))));
246
272
  }
247
273
 
248
274
  function responseInterceptor(request, next) {
@@ -258,7 +284,7 @@ function responseInterceptor(request, next) {
258
284
  if (!options.refreshTokenOnAuthError) {
259
285
  return RequestHelper.onAuthorizationError(error, injector);
260
286
  }
261
- return identityService.refreshTokens('Response Interceptor').pipe(switchMap((accessToken) => next(RequestHelper.attachAuthorizationHeader(request, accessToken))), catchError((error) => RequestHelper.onAuthorizationError(error, injector)));
287
+ return identityService.refreshTokens().pipe(switchMap((accessToken) => next(RequestHelper.attachAuthorizationHeader(request, accessToken))), catchError((error) => RequestHelper.onAuthorizationError(error, injector)));
262
288
  }));
263
289
  }
264
290
 
@@ -271,42 +297,5 @@ function provideIdentity(options) {
271
297
  ];
272
298
  }
273
299
 
274
- const IDENTITY_AUTH_GUARD = (_route, state) => {
275
- const identityService = inject(IdentityService);
276
- const options = inject(IDENTITY_OPTIONS);
277
- return identityService.isAuthenticated(`Auth Guard (${state.url})`).pipe(catchError(() => {
278
- LogHelper.groupStart('Redirecting to IDMS to login');
279
- const redirectUrl = `${options.frontendUrl}/apps/${options.application}?redirect=true&redirect_path=${encodeURIComponent(state.url)}`;
280
- LogHelper.log('Redirect url:', redirectUrl);
281
- window.location.href = redirectUrl;
282
- LogHelper.groupEnd();
283
- return of(null);
284
- }), map((accessToken) => !!accessToken));
285
- };
286
-
287
- const IDENTITY_AUTH_CALLBACK_GUARD = (route) => {
288
- const router = inject(Router);
289
- const tokenService = inject(TokenService);
290
- try {
291
- LogHelper.groupStart('Storing new tokens');
292
- const accessToken = tokenService.setAccessToken(route.queryParams['access_token']);
293
- LogHelper.log("IDMS_AccessToken", accessToken);
294
- const refreshToken = tokenService.setRefreshToken(route.queryParams['refresh_token']);
295
- LogHelper.log("IDMS_RefreshToken", refreshToken);
296
- const redirectPath = route.queryParams['redirect_path'] || '/';
297
- LogHelper.log(`Redirecting to ${redirectPath}`);
298
- LogHelper.groupEnd();
299
- return router.navigateByUrl(route.queryParams['redirect_path'] || '/');
300
- }
301
- catch (error) {
302
- const routerOutlet = document.body.querySelector('router-outlet');
303
- if (routerOutlet) {
304
- routerOutlet.innerHTML = ErrorHelper.extractMessage(error);
305
- }
306
- LogHelper.error(error);
307
- return false;
308
- }
309
- };
310
-
311
- export { IDENTITY_AUTH_CALLBACK_GUARD, IDENTITY_AUTH_GUARD, provideIdentity };
300
+ export { IDENTITY_AUTH_CALLBACK_GUARD, IDENTITY_AUTH_GUARD, IdentityService, provideIdentity };
312
301
  //# sourceMappingURL=ascentgl-ads-identity.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ascentgl-ads-identity.mjs","sources":["../../../../libs/ads-identity/src/lib/helpers/log.helper.ts","../../../../libs/ads-identity/src/lib/helpers/error.helper.ts","../../../../libs/ads-identity/src/lib/helpers/token.helper.ts","../../../../libs/ads-identity/src/lib/types/internal-consts.ts","../../../../libs/ads-identity/src/lib/services/token.service.ts","../../../../libs/ads-identity/src/lib/services/identity.service.ts","../../../../libs/ads-identity/src/lib/helpers/request.helper.ts","../../../../libs/ads-identity/src/lib/interceptors/request.interceptor.ts","../../../../libs/ads-identity/src/lib/interceptors/response.interceptor.ts","../../../../libs/ads-identity/src/lib/providers/identity.provider.ts","../../../../libs/ads-identity/src/lib/guards/auth.guard.ts","../../../../libs/ads-identity/src/lib/guards/auth-callback.guard.ts"],"sourcesContent":["import { IdentityOptions } from '../types/global-types';\r\n\r\nexport class LogHelper {\r\n\r\n static options?: IdentityOptions;\r\n\r\n private static readonly prefix = 'ADS-IDENTITY:';\r\n\r\n static log(...args: unknown[]) {\r\n if (this.options?.debugMode) console.log(...args);\r\n }\r\n\r\n static warn(...args: unknown[]) {\r\n if (this.options?.debugMode) console.warn(...args);\r\n }\r\n\r\n static groupStart(...data: unknown[]) {\r\n if (this.options?.debugMode) console.group(this.prefix, ...data);\r\n }\r\n\r\n static groupEnd() {\r\n if (this.options?.debugMode) console.groupEnd();\r\n }\r\n\r\n static error(...args: unknown[]) {\r\n if (this.options?.debugMode) console.error(...args);\r\n }\r\n\r\n}\r\n","import { LogHelper } from './log.helper';\r\nimport { throwError } from 'rxjs';\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { GenericCollection } from '../types/internal-types';\r\n\r\nexport class ErrorHelper {\r\n\r\n static throw = (error: unknown) => {\r\n\r\n /**\r\n * return \"throwError\" observable that can be used in reactive requests\r\n */\r\n return throwError(() => {\r\n\r\n LogHelper.groupEnd();\r\n\r\n return error;\r\n\r\n });\r\n };\r\n\r\n static extractMessage(error: unknown): string {\r\n\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n\r\n let errorMessage: unknown;\r\n\r\n if (error instanceof HttpErrorResponse) {\r\n errorMessage = error.error?.message ?? error.message;\r\n }\r\n\r\n if (\r\n !errorMessage &&\r\n typeof error === 'object' &&\r\n typeof (<GenericCollection>error)['message'] === 'string'\r\n ) {\r\n errorMessage = (<GenericCollection>error)['message'];\r\n }\r\n\r\n return errorMessage && typeof errorMessage === 'string'\r\n ? errorMessage\r\n : 'Unknown server error';\r\n }\r\n}\r\n","import { InvalidTokenError, jwtDecode, JwtPayload } from 'jwt-decode';\r\nimport { JwtClaim } from '../types/internal-types';\r\nimport { LogHelper } from './log.helper';\r\nimport { ErrorHelper } from './error.helper';\r\n\r\nexport class TokenHelper {\r\n\r\n static getPayload<T extends JwtPayload>(\r\n token: string,\r\n verifyClaims: Partial<JwtPayload> = {},\r\n threshold = 0\r\n ): T {\r\n\r\n const payload = jwtDecode(token) satisfies T;\r\n\r\n /**\r\n * throw error if token is expired\r\n */\r\n if (this.isExpired(payload, 'exp', threshold)) {\r\n throw new InvalidTokenError('Token expired');\r\n }\r\n\r\n /**\r\n * loop through claims to verify and make sure the payload match their values\r\n */\r\n (<JwtClaim[]>Object.keys(verifyClaims)).forEach((claim) => {\r\n\r\n const tokenClaimValue = payload[claim];\r\n const requestedClaimValue = verifyClaims[claim];\r\n\r\n if (tokenClaimValue !== requestedClaimValue) {\r\n throw new InvalidTokenError(`Invalid \"${claim}\" claim value \"${tokenClaimValue}\" provided in token. Required value is \"${requestedClaimValue}\"`);\r\n }\r\n\r\n });\r\n\r\n return payload;\r\n\r\n }\r\n\r\n private static isExpired<T extends JwtPayload>(\r\n token: T,\r\n column: keyof T = 'exp',\r\n threshold = 0\r\n ): boolean {\r\n\r\n const throwInvalidColumnError = (column: string): void => {\r\n throw new InvalidTokenError(\r\n `Column ${column} does not contain a valid number`\r\n );\r\n };\r\n\r\n try {\r\n\r\n /**\r\n * get value from the column\r\n */\r\n let timestamp: unknown = token[column];\r\n\r\n /**\r\n * if values is a number - compare it against current date\r\n */\r\n if (typeof timestamp === 'number') {\r\n\r\n /**\r\n * if threshold is set - extract it from the timestamp\r\n * NOTE: threshold allows to consider the timestamp expired earlier;\r\n * this allows to make sure the token does not expire while being transferred to backend\r\n */\r\n if (threshold) {\r\n timestamp -= threshold;\r\n }\r\n\r\n return !!timestamp && timestamp * 1000 < new Date().getTime();\r\n }\r\n\r\n throwInvalidColumnError(column.toString());\r\n\r\n return true;\r\n } catch (error: unknown) {\r\n\r\n LogHelper.error(new InvalidTokenError(ErrorHelper.extractMessage(error)));\r\n\r\n return true;\r\n }\r\n }\r\n\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { IdentityOptions } from './global-types';\r\n\r\nexport const IDENTITY_OPTIONS = new InjectionToken<IdentityOptions>('IDENTITY_OPTIONS');\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { Maybe, Nullable } from '../types/internal-types';\r\nimport { IdentityToken } from '../types/global-types';\r\nimport { TokenHelper } from '../helpers/token.helper';\r\nimport { InvalidTokenError } from 'jwt-decode';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { TokenKey } from '../types/internal-enums';\r\nimport { LogHelper } from '../helpers/log.helper';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TokenService {\r\n\r\n private accessToken: Nullable<IdentityToken> = null;\r\n private refreshToken: Nullable<IdentityToken> = null;\r\n\r\n private readonly options = inject(IDENTITY_OPTIONS);\r\n\r\n setAccessToken(token: unknown) {\r\n return this.accessToken = this.setToken(TokenKey.accessToken, token);\r\n }\r\n\r\n setRefreshToken(token: unknown) {\r\n return this.refreshToken = this.setToken(TokenKey.refreshToken, token);\r\n }\r\n\r\n getAccessToken() {\r\n return this.accessToken = this.getToken(TokenKey.accessToken, this.accessToken?.token);\r\n }\r\n\r\n getRefreshToken() {\r\n return this.refreshToken = this.getToken(TokenKey.refreshToken, this.refreshToken?.token);\r\n }\r\n\r\n private setToken(key: TokenKey, token: unknown): Nullable<IdentityToken> {\r\n\r\n /**\r\n * make sure provided token is at least a string\r\n */\r\n if (typeof token !== 'string') {\r\n throw new InvalidTokenError(`Provided ${key} value is not a string`);\r\n }\r\n\r\n /**\r\n * get identity token\r\n */\r\n const identityToken = this.wrapToken(key, token, true);\r\n\r\n /**\r\n * if provided - save it to local storage\r\n */\r\n if (identityToken) {\r\n localStorage.setItem(key, token);\r\n }\r\n\r\n return identityToken;\r\n\r\n }\r\n\r\n private getToken(key: TokenKey, token: Maybe<string>): Nullable<IdentityToken> {\r\n\r\n /**\r\n * either use provided token value or get one from the local storage\r\n */\r\n const actualToken = token ?? localStorage.getItem(key) ?? null;\r\n\r\n if (typeof actualToken === 'string') {\r\n return this.wrapToken(key, actualToken, false);\r\n }\r\n\r\n LogHelper.log(key, 'not provided and not found in Local Storage');\r\n\r\n return null;\r\n\r\n }\r\n\r\n private wrapToken(key: TokenKey, token: string, throwError: boolean): Nullable<IdentityToken> {\r\n\r\n try {\r\n\r\n /**\r\n * parse token and obtain its payload\r\n * NOTE: errors will be thrown if token is expired or has invalid claims\r\n */\r\n const payload = TokenHelper.getPayload(\r\n token,\r\n {\r\n iss: this.options.backendUrl + '/api',\r\n sub: this.options.application\r\n },\r\n 10\r\n );\r\n\r\n /**\r\n * prepare identity token object\r\n */\r\n const identityToken = { token, payload: payload };\r\n\r\n LogHelper.log(key, identityToken);\r\n\r\n return identityToken;\r\n\r\n } catch (error: unknown) {\r\n\r\n if(throwError) {\r\n throw error;\r\n }\r\n\r\n LogHelper.error(error);\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { catchError, map, Observable, of } from 'rxjs';\r\nimport { TokenService } from './token.service';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { RefreshTokenResponse } from '../types/internal-types';\r\nimport { LogHelper } from '../helpers/log.helper';\r\nimport { IdentityToken } from '../types/global-types';\r\nimport { InvalidTokenError } from 'jwt-decode';\r\nimport { ErrorHelper } from '../helpers/error.helper';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class IdentityService {\r\n\r\n private readonly tokenService = inject(TokenService);\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly options = inject(IDENTITY_OPTIONS);\r\n\r\n isAuthenticated(caller: string): Observable<IdentityToken> {\r\n\r\n LogHelper.groupStart(`Verifying access token for ${caller}`);\r\n\r\n /**\r\n * get access token\r\n */\r\n const accessToken = this.tokenService.getAccessToken();\r\n\r\n /**\r\n * if it is available - return it; otherwise try refreshing the tokens by calling IDMS\r\n */\r\n if (accessToken) {\r\n\r\n LogHelper.groupEnd();\r\n\r\n return of(accessToken);\r\n\r\n }\r\n\r\n LogHelper.groupEnd();\r\n\r\n LogHelper.groupStart(`Getting refresh token for ${caller}`);\r\n\r\n /**\r\n * if refresh token is available - try getting new tokens\r\n */\r\n if (this.tokenService.getRefreshToken()) {\r\n\r\n LogHelper.groupEnd();\r\n\r\n return this.refreshTokens(caller);\r\n\r\n }\r\n\r\n /**\r\n * throw error if no tokens are available\r\n */\r\n return ErrorHelper.throw(new InvalidTokenError('No valid tokens found'));\r\n\r\n }\r\n\r\n refreshTokens(caller: string): Observable<IdentityToken> {\r\n\r\n LogHelper.groupStart(`Refreshing tokens for ${caller}`);\r\n\r\n const refreshToken = this.tokenService.getRefreshToken();\r\n\r\n /**\r\n * throw error if refresh token is not available\r\n */\r\n if (!refreshToken) {\r\n return ErrorHelper.throw(new InvalidTokenError('No refresh token found'));\r\n }\r\n\r\n const endpoint = `${this.options.backendUrl}/api/v${this.options.apiVersion ?? 1}/refresh-token`;\r\n\r\n LogHelper.log(`Calling ${endpoint} to get new tokens`);\r\n\r\n /**\r\n * make request to IDMS to get new tokens\r\n */\r\n return this.httpClient\r\n .get<RefreshTokenResponse>(endpoint, {\r\n headers: { 'Authorization': `Bearer ${refreshToken.token}` }\r\n })\r\n .pipe(\r\n catchError((error: unknown) => {\r\n\r\n /**\r\n * log error if it happens\r\n */\r\n LogHelper.error(new InvalidTokenError(`Failed to obtain tokens. Reason: ${ErrorHelper.extractMessage(error).toLowerCase()}`));\r\n\r\n return ErrorHelper.throw(error);\r\n\r\n }),\r\n map((response) => {\r\n\r\n /**\r\n * store new access and refresh tokens\r\n */\r\n const accessToken = this.tokenService.setAccessToken(response.access_token);\r\n this.tokenService.setRefreshToken(response.refresh_token);\r\n\r\n /**\r\n * if new access token is valid - return it\r\n */\r\n if (accessToken) {\r\n\r\n LogHelper.groupEnd();\r\n\r\n return accessToken;\r\n\r\n }\r\n\r\n throw new InvalidTokenError('Could not set access token');\r\n\r\n })\r\n );\r\n\r\n }\r\n\r\n}\r\n","import { HttpErrorResponse, HttpRequest } from '@angular/common/http';\r\nimport { IdentityOptions, IdentityToken } from '../types/global-types';\r\nimport { throwError } from 'rxjs';\r\nimport { Injector } from '@angular/core';\r\n\r\nexport class RequestHelper {\r\n\r\n static options?: IdentityOptions;\r\n\r\n static isIdentityEndpointRequest(request: HttpRequest<unknown>): boolean {\r\n return request.url.startsWith(this.options?.backendUrl ?? '');\r\n }\r\n\r\n static isAuthorizedRequest(request: HttpRequest<unknown>): boolean {\r\n return !this.options?.requestFilter || this.options.requestFilter(request);\r\n }\r\n\r\n static isAuthorizationError(error: unknown): boolean {\r\n return error instanceof HttpErrorResponse && error.status === 401;\r\n }\r\n\r\n static attachAuthorizationHeader(request: HttpRequest<unknown>, accessToken: IdentityToken): HttpRequest<unknown> {\r\n\r\n return request.clone({\r\n setHeaders: { authorization: `Bearer ${accessToken.token}` }\r\n });\r\n\r\n }\r\n\r\n static onAuthorizationError(error: unknown, injector: Injector) {\r\n\r\n if (this.options?.onAuthorizationError) {\r\n console.log('BOO');\r\n this.options?.onAuthorizationError(error, injector);\r\n }\r\n\r\n return throwError(() => error);\r\n\r\n };\r\n\r\n}\r\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { catchError, Observable, switchMap } from 'rxjs';\nimport { inject, Injector } from '@angular/core';\nimport { IdentityService } from '../services/identity.service';\nimport { RequestHelper } from '../helpers/request.helper';\n\nexport function requestInterceptor(\n request: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> {\n\n const identityService = inject(IdentityService);\n const injector = inject(Injector)\n\n /**\n * if it is a request to IDMS or not an authorized request - do not modify it\n */\n if (RequestHelper.isIdentityEndpointRequest(request) ||\n !RequestHelper.isAuthorizedRequest(request)) {\n return next(request);\n }\n\n /**\n * if current user is authenticated - attach \"Authorization\" header to the request;\n * or process the error if it happens\n */\n return identityService.isAuthenticated(`Request Interceptor (${request.url})`).pipe(\n catchError((error: unknown) => RequestHelper.onAuthorizationError(error, injector)),\n switchMap(accessToken => next(RequestHelper.attachAuthorizationHeader(request, accessToken))),\n );\n\n\n}\n","import {\n HttpEvent, HttpHandlerFn,\n HttpRequest\n} from '@angular/common/http';\nimport { catchError, Observable, switchMap, throwError } from 'rxjs';\nimport { inject, Injector } from '@angular/core';\nimport { IdentityService } from '../services/identity.service';\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\nimport { RequestHelper } from '../helpers/request.helper';\n\nexport function responseInterceptor(\n request: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> {\n\n const options = inject(IDENTITY_OPTIONS);\n const identityService = inject(IdentityService);\n const injector = inject(Injector);\n\n /**\n * process all response errors\n */\n return next(request).pipe(\n catchError((error: unknown) => {\n\n /**\n * if error happened with IDMS request, or not-authorized request, or it is not an authorization (401) error -\n * do not change anything and return the error as is\n */\n if (\n RequestHelper.isIdentityEndpointRequest(request) ||\n !RequestHelper.isAuthorizedRequest(request) ||\n !RequestHelper.isAuthorizationError(error)\n ) {\n return throwError(() => error);\n }\n\n /**\n * if options do not allow to try and refresh tokens on error 401 -\n * process the error and return it\n */\n if (!options.refreshTokenOnAuthError) {\n return RequestHelper.onAuthorizationError(error, injector);\n }\n\n /**\n * if tokens were refreshed - attach \"Authorization\" header to the request and call it again;\n * or process the error if it happens\n */\n return identityService.refreshTokens('Response Interceptor').pipe(\n switchMap((accessToken) => next(RequestHelper.attachAuthorizationHeader(request, accessToken))),\n catchError((error: unknown) => RequestHelper.onAuthorizationError(error, injector))\n );\n\n }));\n}\n","import { IdentityOptions } from '../types/global-types';\r\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\r\nimport { requestInterceptor } from '../interceptors/request.interceptor';\r\nimport { responseInterceptor } from '../interceptors/response.interceptor';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { LogHelper } from '../helpers/log.helper';\r\nimport { RequestHelper } from '../helpers/request.helper';\r\n\r\nexport function provideIdentity(options: IdentityOptions) {\r\n\r\n LogHelper.options = options;\r\n RequestHelper.options = options;\r\n\r\n return [\r\n { provide: IDENTITY_OPTIONS, useValue: options },\r\n provideHttpClient(withInterceptors([requestInterceptor, responseInterceptor]))\r\n ];\r\n}\r\n","import { CanActivateFn } from '@angular/router';\r\nimport { inject } from '@angular/core';\r\nimport { IdentityService } from '../services/identity.service';\r\nimport { catchError, map, of } from 'rxjs';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { LogHelper } from '../helpers/log.helper';\r\n\r\nexport const IDENTITY_AUTH_GUARD: CanActivateFn = (_route, state) => {\r\n\r\n const identityService = inject(IdentityService);\r\n const options = inject(IDENTITY_OPTIONS);\r\n\r\n /**\r\n * check if user is authenticated;\r\n * if error happened - redirect to IDMS url to re-login;\r\n * return true on success and false on error\r\n */\r\n return identityService.isAuthenticated(`Auth Guard (${state.url})`).pipe(\r\n catchError(() => {\r\n\r\n LogHelper.groupStart('Redirecting to IDMS to login');\r\n\r\n const redirectUrl = `${options.frontendUrl}/apps/${options.application}?redirect=true&redirect_path=${encodeURIComponent(\r\n state.url\r\n )}`;\r\n\r\n LogHelper.log('Redirect url:', redirectUrl);\r\n\r\n window.location.href = redirectUrl;\r\n\r\n LogHelper.groupEnd();\r\n\r\n return of(null);\r\n\r\n }),\r\n map((accessToken) => !!accessToken));\r\n\r\n};\r\n","import { CanActivateFn, Router } from '@angular/router';\r\nimport { inject } from '@angular/core';\r\nimport { TokenService } from '../services/token.service';\r\nimport { LogHelper } from '../helpers/log.helper';\r\nimport { TokenKey } from '../types/internal-enums';\r\nimport { ErrorHelper } from '../helpers/error.helper';\r\n\r\nexport const IDENTITY_AUTH_CALLBACK_GUARD: CanActivateFn = (route) => {\r\n\r\n const router = inject(Router);\r\n const tokenService = inject(TokenService);\r\n\r\n /**\r\n * save access and refresh tokens and redirect either to root or to provided \"redirect_path\";\r\n * if error happened - display error message on the page and return false to stop further navigation\r\n */\r\n try {\r\n\r\n LogHelper.groupStart('Storing new tokens');\r\n\r\n const accessToken = tokenService.setAccessToken(route.queryParams['access_token']);\r\n\r\n LogHelper.log(TokenKey.accessToken, accessToken);\r\n\r\n const refreshToken = tokenService.setRefreshToken(route.queryParams['refresh_token']);\r\n\r\n LogHelper.log(TokenKey.refreshToken, refreshToken);\r\n\r\n const redirectPath = route.queryParams['redirect_path'] || '/';\r\n\r\n LogHelper.log(`Redirecting to ${redirectPath}`);\r\n\r\n LogHelper.groupEnd();\r\n\r\n return router.navigateByUrl(route.queryParams['redirect_path'] || '/');\r\n\r\n } catch (error: unknown) {\r\n\r\n const routerOutlet = document.body.querySelector('router-outlet');\r\n\r\n if (routerOutlet) {\r\n routerOutlet.innerHTML = ErrorHelper.extractMessage(error);\r\n }\r\n\r\n LogHelper.error(error);\r\n\r\n return false;\r\n\r\n }\r\n\r\n};\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ascentgl-ads-identity.mjs","sources":["../../../../libs/ads-identity/src/lib/helpers/log.helper.ts","../../../../libs/ads-identity/src/lib/helpers/error.helper.ts","../../../../libs/ads-identity/src/lib/helpers/token.helper.ts","../../../../libs/ads-identity/src/lib/types/internal-consts.ts","../../../../libs/ads-identity/src/lib/services/token.service.ts","../../../../libs/ads-identity/src/lib/services/identity.service.ts","../../../../libs/ads-identity/src/lib/guards/auth.guard.ts","../../../../libs/ads-identity/src/lib/guards/auth-callback.guard.ts","../../../../libs/ads-identity/src/lib/helpers/request.helper.ts","../../../../libs/ads-identity/src/lib/interceptors/request.interceptor.ts","../../../../libs/ads-identity/src/lib/interceptors/response.interceptor.ts","../../../../libs/ads-identity/src/lib/providers/identity.provider.ts"],"sourcesContent":["import { IdentityOptions } from '../types/global-types';\r\n\r\nexport class LogHelper {\r\n\r\n static options?: IdentityOptions;\r\n\r\n private static readonly prefix = 'ADS-IDENTITY';\r\n\r\n static log(...args: unknown[]) {\r\n\r\n if (!this.options?.debugMode) return;\r\n\r\n console.group(this.prefix, 'TOKEN UPDATE');\r\n\r\n console.log(...args);\r\n\r\n console.groupEnd();\r\n\r\n }\r\n\r\n static error(...args: unknown[]) {\r\n\r\n if (!this.options?.debugMode) return;\r\n\r\n console.group(this.prefix, 'EXCEPTION');\r\n\r\n console.error(...args);\r\n\r\n console.groupEnd();\r\n\r\n }\r\n\r\n}\r\n","import { HttpErrorResponse } from '@angular/common/http';\r\nimport { GenericCollection } from '../types/internal-types';\r\n\r\nexport class ErrorHelper {\r\n\r\n static extractMessage(error: unknown): string {\r\n\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n\r\n let errorMessage: unknown;\r\n\r\n if (error instanceof HttpErrorResponse) {\r\n errorMessage = error.error?.message ?? error.message;\r\n }\r\n\r\n if (\r\n !errorMessage &&\r\n typeof error === 'object' &&\r\n typeof (<GenericCollection>error)['message'] === 'string'\r\n ) {\r\n errorMessage = (<GenericCollection>error)['message'];\r\n }\r\n\r\n return errorMessage && typeof errorMessage === 'string'\r\n ? errorMessage\r\n : 'Unknown server error';\r\n }\r\n}\r\n","import { InvalidTokenError, jwtDecode, JwtPayload } from 'jwt-decode';\r\nimport { JwtClaim } from '../types/internal-types';\r\nimport { LogHelper } from './log.helper';\r\nimport { ErrorHelper } from './error.helper';\r\n\r\nexport class TokenHelper {\r\n\r\n static getPayload<T extends JwtPayload>(\r\n token: string,\r\n verifyClaims: Partial<JwtPayload> = {},\r\n threshold = 0\r\n ): T {\r\n\r\n const payload = jwtDecode(token) satisfies T;\r\n\r\n /**\r\n * throw error if token is expired\r\n */\r\n if (this.isExpired(payload, 'exp', threshold)) {\r\n throw new InvalidTokenError('Token expired');\r\n }\r\n\r\n /**\r\n * loop through claims to verify and make sure the payload match their values\r\n */\r\n (<JwtClaim[]>Object.keys(verifyClaims)).forEach((claim) => {\r\n\r\n const tokenClaimValue = payload[claim];\r\n const requestedClaimValue = verifyClaims[claim];\r\n\r\n if (tokenClaimValue !== requestedClaimValue) {\r\n throw new InvalidTokenError(`Invalid \"${claim}\" claim value \"${tokenClaimValue}\" provided in token. Required value is \"${requestedClaimValue}\"`);\r\n }\r\n\r\n });\r\n\r\n return payload;\r\n\r\n }\r\n\r\n private static isExpired<T extends JwtPayload>(\r\n token: T,\r\n column: keyof T = 'exp',\r\n threshold = 0\r\n ): boolean {\r\n\r\n const throwInvalidColumnError = (column: string): void => {\r\n throw new InvalidTokenError(\r\n `Column ${column} does not contain a valid number`\r\n );\r\n };\r\n\r\n try {\r\n\r\n /**\r\n * get value from the column\r\n */\r\n let timestamp: unknown = token[column];\r\n\r\n /**\r\n * if values is a number - compare it against current date\r\n */\r\n if (typeof timestamp === 'number') {\r\n\r\n /**\r\n * if threshold is set - extract it from the timestamp\r\n * NOTE: threshold allows to consider the timestamp expired earlier;\r\n * this allows to make sure the token does not expire while being transferred to backend\r\n */\r\n if (threshold) {\r\n timestamp -= threshold;\r\n }\r\n\r\n return !!timestamp && timestamp * 1000 < new Date().getTime();\r\n }\r\n\r\n throwInvalidColumnError(column.toString());\r\n\r\n return true;\r\n } catch (error: unknown) {\r\n\r\n LogHelper.error(new InvalidTokenError(ErrorHelper.extractMessage(error)));\r\n\r\n return true;\r\n }\r\n }\r\n\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { IdentityOptions } from './global-types';\r\n\r\nexport const IDENTITY_OPTIONS = new InjectionToken<IdentityOptions>('IDENTITY_OPTIONS');\r\n","import { computed, inject, Injectable, signal } from '@angular/core';\r\nimport { Maybe, Nullable } from '../types/internal-types';\r\nimport { IdentityToken } from '../types/global-types';\r\nimport { TokenHelper } from '../helpers/token.helper';\r\nimport { InvalidTokenError } from 'jwt-decode';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { TokenKey } from '../types/internal-enums';\r\nimport { LogHelper } from '../helpers/log.helper';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TokenService {\r\n\r\n /**\r\n * NOTE: we expose access and refresh tokens as computed signals so that they can be\r\n * used in \"IdentityService\" to allow library users reactive readonly access to tokens,\r\n * since \"IdentityService\" is the only \"public\" service in the library\r\n */\r\n readonlyAccessToken = computed(() => this.accessToken());\r\n readonlyRefreshToken = computed(() => this.refreshToken());\r\n\r\n private accessToken = signal<Nullable<IdentityToken>>(null);\r\n private refreshToken = signal<Nullable<IdentityToken>>(null);\r\n\r\n private readonly options = inject(IDENTITY_OPTIONS);\r\n\r\n setAccessToken(token: unknown) {\r\n return this.updateAccessTokenSignal(this.setToken(TokenKey.accessToken, token));\r\n }\r\n\r\n getAccessToken() {\r\n return this.updateAccessTokenSignal(this.getToken(TokenKey.accessToken, this.accessToken()?.token));\r\n }\r\n\r\n setRefreshToken(token: unknown) {\r\n return this.updateRefreshTokenSignal(this.setToken(TokenKey.refreshToken, token));\r\n }\r\n\r\n getRefreshToken() {\r\n return this.updateRefreshTokenSignal(this.getToken(TokenKey.refreshToken, this.refreshToken()?.token));\r\n }\r\n\r\n private updateAccessTokenSignal(newToken: Nullable<IdentityToken>) {\r\n\r\n if (this.accessToken()?.token === newToken?.token) {\r\n return this.accessToken();\r\n }\r\n\r\n this.accessToken.set(newToken);\r\n\r\n return this.logToken(TokenKey.accessToken, newToken);\r\n\r\n }\r\n\r\n private updateRefreshTokenSignal(newToken: Nullable<IdentityToken>) {\r\n\r\n if (this.refreshToken()?.token === newToken?.token) {\r\n return this.refreshToken();\r\n }\r\n\r\n this.refreshToken.set(newToken);\r\n\r\n return this.logToken(TokenKey.refreshToken, newToken);\r\n\r\n }\r\n\r\n private setToken(key: TokenKey, token: unknown): Nullable<IdentityToken> {\r\n\r\n /**\r\n * make sure provided token is at least a string\r\n */\r\n if (typeof token !== 'string') {\r\n throw new InvalidTokenError(`Provided ${key} value is not a string`);\r\n }\r\n\r\n /**\r\n * get identity token\r\n */\r\n const identityToken = this.wrapToken(token, true);\r\n\r\n /**\r\n * if provided - save it to local storage\r\n */\r\n if (identityToken) {\r\n localStorage.setItem(key, token);\r\n }\r\n\r\n return identityToken;\r\n\r\n }\r\n\r\n private getToken(key: TokenKey, token: Maybe<string>): Nullable<IdentityToken> {\r\n\r\n /**\r\n * either use provided token value or get one from the local storage\r\n */\r\n const actualToken = token ?? localStorage.getItem(key) ?? null;\r\n\r\n if (typeof actualToken === 'string') {\r\n return this.wrapToken(actualToken, false);\r\n }\r\n\r\n return null;\r\n\r\n }\r\n\r\n private wrapToken(token: string, throwError: boolean): Nullable<IdentityToken> {\r\n\r\n try {\r\n\r\n /**\r\n * parse token and obtain its payload\r\n * NOTE: errors will be thrown if token is expired or has invalid claims\r\n */\r\n const payload = TokenHelper.getPayload(\r\n token,\r\n {\r\n iss: this.options.backendUrl + '/api',\r\n sub: this.options.application\r\n },\r\n 10\r\n );\r\n\r\n /**\r\n * return identity token object\r\n */\r\n return { token, payload: payload };\r\n\r\n } catch (error: unknown) {\r\n\r\n if (throwError) {\r\n throw error;\r\n }\r\n\r\n LogHelper.error(error);\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n private logToken(key: TokenKey, token: Nullable<IdentityToken>) {\r\n\r\n LogHelper.log(key, token);\r\n\r\n return token;\r\n\r\n }\r\n\r\n}\r\n","import { computed, inject, Injectable } from '@angular/core';\r\nimport { catchError, map, Observable, of, throwError } from 'rxjs';\r\nimport { TokenService } from './token.service';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { RefreshTokenResponse } from '../types/internal-types';\r\nimport { LogHelper } from '../helpers/log.helper';\r\nimport { IdentityToken } from '../types/global-types';\r\nimport { InvalidTokenError } from 'jwt-decode';\r\nimport { ErrorHelper } from '../helpers/error.helper';\r\nimport { IdentityServiceInterface } from '../interfaces/identity-service.interface';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class IdentityService implements IdentityServiceInterface {\r\n\r\n /**\r\n * NOTE: we expose access and refresh tokens as computed signals to allow\r\n * library users reactive readonly access to tokens, since \"IdentityService\"\r\n * is the only \"public\" service in the library\r\n */\r\n accessToken = computed(() => this.tokenService.readonlyAccessToken());\r\n refreshToken = computed(() => this.tokenService.readonlyRefreshToken());\r\n\r\n private readonly tokenService = inject(TokenService);\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly options = inject(IDENTITY_OPTIONS);\r\n\r\n isAuthenticated(): Observable<IdentityToken> {\r\n\r\n /**\r\n * get access and refresh token\r\n */\r\n const accessToken = this.tokenService.getAccessToken();\r\n const refreshToken = this.tokenService.getRefreshToken();\r\n\r\n /**\r\n * if it is available - return it; otherwise try refreshing the tokens by calling IDMS\r\n */\r\n if (accessToken) {\r\n return of(accessToken);\r\n }\r\n\r\n /**\r\n * if refresh token is available - try getting new tokens\r\n */\r\n if (refreshToken) {\r\n return this.refreshTokens();\r\n }\r\n\r\n /**\r\n * throw error if no tokens are available\r\n */\r\n return throwError(() => new InvalidTokenError('No valid tokens found'));\r\n\r\n }\r\n\r\n refreshTokens(): Observable<IdentityToken> {\r\n\r\n const refreshToken = this.tokenService.getRefreshToken();\r\n\r\n /**\r\n * throw error if refresh token is not available\r\n */\r\n if (!refreshToken) {\r\n return throwError(() => new InvalidTokenError('No refresh token found'));\r\n }\r\n\r\n /**\r\n * make request to IDMS to get new tokens\r\n */\r\n return this.httpClient\r\n .get<RefreshTokenResponse>(`${this.options.backendUrl}/api/v${this.options.apiVersion ?? 1}/refresh-token`, {\r\n headers: { 'Authorization': `Bearer ${refreshToken.token}` }\r\n })\r\n .pipe(\r\n catchError((error: unknown) => {\r\n\r\n /**\r\n * log error if it happens\r\n */\r\n LogHelper.error(new InvalidTokenError(`Failed to obtain tokens. Reason: ${ErrorHelper.extractMessage(error).toLowerCase()}`));\r\n\r\n return throwError(() => error);\r\n\r\n }),\r\n map((response) => {\r\n\r\n /**\r\n * store new access and refresh tokens\r\n */\r\n const accessToken = this.tokenService.setAccessToken(response.access_token);\r\n\r\n this.tokenService.setRefreshToken(response.refresh_token);\r\n\r\n /**\r\n * if new access token is valid - return it\r\n */\r\n if (accessToken) {\r\n return accessToken;\r\n }\r\n\r\n throw new InvalidTokenError('Could not set access token');\r\n\r\n })\r\n );\r\n\r\n }\r\n\r\n}\r\n","import { CanActivateFn } from '@angular/router';\r\nimport { inject } from '@angular/core';\r\nimport { IdentityService } from '../services/identity.service';\r\nimport { catchError, map, of } from 'rxjs';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { LogHelper } from '../helpers/log.helper';\r\n\r\nexport const IDENTITY_AUTH_GUARD: CanActivateFn = (_route, state) => {\r\n\r\n const identityService = inject(IdentityService);\r\n const options = inject(IDENTITY_OPTIONS);\r\n\r\n /**\r\n * check if user is authenticated;\r\n * if error happened - redirect to IDMS url to re-login;\r\n * return true on success and false on error\r\n */\r\n return identityService.isAuthenticated().pipe(\r\n catchError((error) => {\r\n\r\n window.location.href = `${options.frontendUrl}/apps/${options.application}?redirect=true&redirect_path=${encodeURIComponent(\r\n state.url\r\n )}`\r\n\r\n LogHelper.error(error);\r\n\r\n return of(null);\r\n\r\n }),\r\n map((accessToken) => !!accessToken));\r\n\r\n};\r\n","import { CanActivateFn, Router } from '@angular/router';\r\nimport { inject } from '@angular/core';\r\nimport { TokenService } from '../services/token.service';\r\nimport { LogHelper } from '../helpers/log.helper';\r\nimport { ErrorHelper } from '../helpers/error.helper';\r\n\r\nexport const IDENTITY_AUTH_CALLBACK_GUARD: CanActivateFn = (route) => {\r\n\r\n const router = inject(Router);\r\n const tokenService = inject(TokenService);\r\n\r\n /**\r\n * save access and refresh tokens and redirect either to root or to provided \"redirect_path\";\r\n * if error happened - display error message on the page and return false to stop further navigation\r\n */\r\n try {\r\n\r\n tokenService.setAccessToken(route.queryParams['access_token']);\r\n\r\n tokenService.setRefreshToken(route.queryParams['refresh_token']);\r\n\r\n return router.navigateByUrl(route.queryParams['redirect_path'] || '/');\r\n\r\n } catch (error: unknown) {\r\n\r\n const routerOutlet = document.body.querySelector('router-outlet');\r\n\r\n if (routerOutlet) {\r\n routerOutlet.innerHTML = ErrorHelper.extractMessage(error);\r\n }\r\n\r\n LogHelper.error(error);\r\n\r\n return false;\r\n\r\n }\r\n\r\n};\r\n","import { HttpErrorResponse, HttpRequest } from '@angular/common/http';\r\nimport { IdentityOptions, IdentityToken } from '../types/global-types';\r\nimport { throwError } from 'rxjs';\r\nimport { Injector } from '@angular/core';\r\n\r\nexport class RequestHelper {\r\n\r\n static options?: IdentityOptions;\r\n\r\n static isIdentityEndpointRequest(request: HttpRequest<unknown>): boolean {\r\n return request.url.startsWith(this.options?.backendUrl ?? '');\r\n }\r\n\r\n static isAuthorizedRequest(request: HttpRequest<unknown>): boolean {\r\n return !this.options?.requestFilter || this.options.requestFilter(request);\r\n }\r\n\r\n static isAuthorizationError(error: unknown): boolean {\r\n return error instanceof HttpErrorResponse && error.status === 401;\r\n }\r\n\r\n static attachAuthorizationHeader(request: HttpRequest<unknown>, accessToken: IdentityToken): HttpRequest<unknown> {\r\n\r\n return request.clone({\r\n setHeaders: { authorization: `Bearer ${accessToken.token}` }\r\n });\r\n\r\n }\r\n\r\n static onAuthorizationError(error: unknown, injector: Injector) {\r\n\r\n if (this.options?.onAuthorizationError) {\r\n this.options?.onAuthorizationError(error, injector);\r\n }\r\n\r\n return throwError(() => error);\r\n\r\n };\r\n\r\n}\r\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\r\nimport { catchError, Observable, switchMap } from 'rxjs';\r\nimport { inject, Injector } from '@angular/core';\r\nimport { IdentityService } from '../services/identity.service';\r\nimport { RequestHelper } from '../helpers/request.helper';\r\n\r\nexport function requestInterceptor(\r\n request: HttpRequest<unknown>,\r\n next: HttpHandlerFn\r\n): Observable<HttpEvent<unknown>> {\r\n\r\n const identityService = inject(IdentityService);\r\n const injector = inject(Injector)\r\n\r\n /**\r\n * if it is a request to IDMS or not an authorized request - do not modify it\r\n */\r\n if (RequestHelper.isIdentityEndpointRequest(request) ||\r\n !RequestHelper.isAuthorizedRequest(request)) {\r\n return next(request);\r\n }\r\n\r\n /**\r\n * if current user is authenticated - attach \"Authorization\" header to the request;\r\n * or process the error if it happens\r\n */\r\n return identityService.isAuthenticated().pipe(\r\n catchError((error: unknown) => RequestHelper.onAuthorizationError(error, injector)),\r\n switchMap(accessToken => next(RequestHelper.attachAuthorizationHeader(request, accessToken))),\r\n );\r\n\r\n\r\n}\r\n","import {\r\n HttpEvent, HttpHandlerFn,\r\n HttpRequest\r\n} from '@angular/common/http';\r\nimport { catchError, Observable, switchMap, throwError } from 'rxjs';\r\nimport { inject, Injector } from '@angular/core';\r\nimport { IdentityService } from '../services/identity.service';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { RequestHelper } from '../helpers/request.helper';\r\n\r\nexport function responseInterceptor(\r\n request: HttpRequest<unknown>,\r\n next: HttpHandlerFn\r\n): Observable<HttpEvent<unknown>> {\r\n\r\n const options = inject(IDENTITY_OPTIONS);\r\n const identityService = inject(IdentityService);\r\n const injector = inject(Injector);\r\n\r\n /**\r\n * process all response errors\r\n */\r\n return next(request).pipe(\r\n catchError((error: unknown) => {\r\n\r\n /**\r\n * if error happened with IDMS request, or not-authorized request, or it is not an authorization (401) error -\r\n * do not change anything and return the error as is\r\n */\r\n if (\r\n RequestHelper.isIdentityEndpointRequest(request) ||\r\n !RequestHelper.isAuthorizedRequest(request) ||\r\n !RequestHelper.isAuthorizationError(error)\r\n ) {\r\n\r\n return throwError(() => error);\r\n }\r\n\r\n /**\r\n * if options do not allow to try and refresh tokens on error 401 -\r\n * process the error and return it\r\n */\r\n if (!options.refreshTokenOnAuthError) {\r\n return RequestHelper.onAuthorizationError(error, injector);\r\n }\r\n\r\n /**\r\n * if tokens were refreshed - attach \"Authorization\" header to the request and call it again;\r\n * or process the error if it happens\r\n */\r\n return identityService.refreshTokens().pipe(\r\n switchMap((accessToken) => next(RequestHelper.attachAuthorizationHeader(request, accessToken))),\r\n catchError((error: unknown) => RequestHelper.onAuthorizationError(error, injector))\r\n );\r\n\r\n }));\r\n}\r\n","import { IdentityOptions } from '../types/global-types';\r\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\r\nimport { requestInterceptor } from '../interceptors/request.interceptor';\r\nimport { responseInterceptor } from '../interceptors/response.interceptor';\r\nimport { IDENTITY_OPTIONS } from '../types/internal-consts';\r\nimport { LogHelper } from '../helpers/log.helper';\r\nimport { RequestHelper } from '../helpers/request.helper';\r\n\r\nexport function provideIdentity(options: IdentityOptions) {\r\n\r\n LogHelper.options = options;\r\n RequestHelper.options = options;\r\n\r\n return [\r\n { provide: IDENTITY_OPTIONS, useValue: options },\r\n provideHttpClient(withInterceptors([requestInterceptor, responseInterceptor]))\r\n ];\r\n}\r\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- export * from './lib/providers/identity.provider';
2
1
  export * from './lib/guards/auth.guard';
3
2
  export * from './lib/guards/auth-callback.guard';
3
+ export * from './lib/interfaces/identity-service.interface';
4
+ export * from './lib/providers/identity.provider';
5
+ export * from './lib/services/identity.service';
4
6
  export * from './lib/types/global-types';
@@ -1,4 +1,3 @@
1
1
  export declare class ErrorHelper {
2
- static throw: (error: unknown) => import("rxjs").Observable<never>;
3
2
  static extractMessage(error: unknown): string;
4
3
  }
@@ -3,8 +3,5 @@ export declare class LogHelper {
3
3
  static options?: IdentityOptions;
4
4
  private static readonly prefix;
5
5
  static log(...args: unknown[]): void;
6
- static warn(...args: unknown[]): void;
7
- static groupStart(...data: unknown[]): void;
8
- static groupEnd(): void;
9
6
  static error(...args: unknown[]): void;
10
7
  }
@@ -0,0 +1,9 @@
1
+ import { Signal } from '@angular/core';
2
+ import { IdentityToken } from '../types/global-types';
3
+ import { Observable } from 'rxjs';
4
+ export interface IdentityServiceInterface {
5
+ accessToken: Signal<IdentityToken | null>;
6
+ refreshToken: Signal<IdentityToken | null>;
7
+ isAuthenticated(): Observable<IdentityToken>;
8
+ refreshTokens(): Observable<IdentityToken>;
9
+ }
@@ -1,12 +1,15 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { IdentityToken } from '../types/global-types';
3
+ import { IdentityServiceInterface } from '../interfaces/identity-service.interface';
3
4
  import * as i0 from "@angular/core";
4
- export declare class IdentityService {
5
+ export declare class IdentityService implements IdentityServiceInterface {
6
+ accessToken: import("@angular/core").Signal<import("../types/internal-types").Nullable<IdentityToken>>;
7
+ refreshToken: import("@angular/core").Signal<import("../types/internal-types").Nullable<IdentityToken>>;
5
8
  private readonly tokenService;
6
9
  private readonly httpClient;
7
10
  private readonly options;
8
- isAuthenticated(caller: string): Observable<IdentityToken>;
9
- refreshTokens(caller: string): Observable<IdentityToken>;
11
+ isAuthenticated(): Observable<IdentityToken>;
12
+ refreshTokens(): Observable<IdentityToken>;
10
13
  static ɵfac: i0.ɵɵFactoryDeclaration<IdentityService, never>;
11
14
  static ɵprov: i0.ɵɵInjectableDeclaration<IdentityService>;
12
15
  }
@@ -2,16 +2,21 @@ import { Nullable } from '../types/internal-types';
2
2
  import { IdentityToken } from '../types/global-types';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class TokenService {
5
+ readonlyAccessToken: import("@angular/core").Signal<Nullable<IdentityToken>>;
6
+ readonlyRefreshToken: import("@angular/core").Signal<Nullable<IdentityToken>>;
5
7
  private accessToken;
6
8
  private refreshToken;
7
9
  private readonly options;
8
10
  setAccessToken(token: unknown): Nullable<IdentityToken>;
9
- setRefreshToken(token: unknown): Nullable<IdentityToken>;
10
11
  getAccessToken(): Nullable<IdentityToken>;
12
+ setRefreshToken(token: unknown): Nullable<IdentityToken>;
11
13
  getRefreshToken(): Nullable<IdentityToken>;
14
+ private updateAccessTokenSignal;
15
+ private updateRefreshTokenSignal;
12
16
  private setToken;
13
17
  private getToken;
14
18
  private wrapToken;
19
+ private logToken;
15
20
  static ɵfac: i0.ɵɵFactoryDeclaration<TokenService, never>;
16
21
  static ɵprov: i0.ɵɵInjectableDeclaration<TokenService>;
17
22
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ascentgl/ads-identity",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "peerDependencies": {
5
5
  "@ascentgl/ads-store": ">=0.9.5",
6
6
  "jwt-decode": ">=4.0.0"