@ascentgl/ads-identity 0.0.2 → 0.0.4
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.
- package/fesm2022/ascentgl-ads-identity.mjs +88 -99
- package/fesm2022/ascentgl-ads-identity.mjs.map +1 -1
- package/index.d.ts +2 -1
- package/lib/helpers/error.helper.d.ts +0 -1
- package/lib/helpers/log.helper.d.ts +0 -3
- package/lib/services/identity.service.d.ts +4 -2
- package/lib/services/token.service.d.ts +6 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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.
|
|
100
|
-
this.
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
if (this.tokenService.getRefreshToken()) {
|
|
175
|
-
LogHelper.groupEnd();
|
|
176
|
-
return this.refreshTokens(caller);
|
|
178
|
+
if (refreshToken) {
|
|
179
|
+
return this.refreshTokens();
|
|
177
180
|
}
|
|
178
|
-
return
|
|
181
|
+
return throwError(() => new InvalidTokenError('No valid tokens found'));
|
|
179
182
|
}
|
|
180
|
-
refreshTokens(
|
|
181
|
-
LogHelper.groupStart(`Refreshing tokens for ${caller}`);
|
|
183
|
+
refreshTokens() {
|
|
182
184
|
const refreshToken = this.tokenService.getRefreshToken();
|
|
183
185
|
if (!refreshToken) {
|
|
184
|
-
return
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class IdentityService {\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';\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().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\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().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"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
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/providers/identity.provider';
|
|
4
|
+
export * from './lib/services/identity.service';
|
|
4
5
|
export * from './lib/types/global-types';
|
|
@@ -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
|
}
|
|
@@ -2,11 +2,13 @@ import { Observable } from 'rxjs';
|
|
|
2
2
|
import { IdentityToken } from '../types/global-types';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class IdentityService {
|
|
5
|
+
accessToken: import("@angular/core").Signal<import("../types/internal-types").Nullable<IdentityToken>>;
|
|
6
|
+
refreshToken: import("@angular/core").Signal<import("../types/internal-types").Nullable<IdentityToken>>;
|
|
5
7
|
private readonly tokenService;
|
|
6
8
|
private readonly httpClient;
|
|
7
9
|
private readonly options;
|
|
8
|
-
isAuthenticated(
|
|
9
|
-
refreshTokens(
|
|
10
|
+
isAuthenticated(): Observable<IdentityToken>;
|
|
11
|
+
refreshTokens(): Observable<IdentityToken>;
|
|
10
12
|
static ɵfac: i0.ɵɵFactoryDeclaration<IdentityService, never>;
|
|
11
13
|
static ɵprov: i0.ɵɵInjectableDeclaration<IdentityService>;
|
|
12
14
|
}
|
|
@@ -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
|
}
|