@devlearning/jwt-auth
Version:
Jwt Angular Authentication manager with automatic Refresh Token management.
1 lines • 45.7 kB
Source Map (JSON)
{"version":3,"file":"devlearning-jwt-auth.mjs","sources":["../../../projects/jwt-auth/src/lib/models/jwt-token-base.ts","../../../projects/jwt-auth/src/lib/models/jwt-response-error.ts","../../../projects/jwt-auth/src/lib/models/storage-type.ts","../../../projects/jwt-auth/src/lib/models/jwt-auth-config.ts","../../../projects/jwt-auth/src/lib/models/jwt-auth-log-level.ts","../../../projects/jwt-auth/src/lib/models/token-request.ts","../../../projects/jwt-auth/src/lib/models/refresh-token-request.ts","../../../projects/jwt-auth/src/lib/jwt-auth-config.injector.ts","../../../projects/jwt-auth/src/lib/models/www-authenticate-message.ts","../../../projects/jwt-auth/src/lib/jwt-auth.service.ts","../../../projects/jwt-auth/src/lib/jwt-auth.interceptor.ts","../../../projects/jwt-auth/src/lib/jwt-auth.guard.ts","../../../projects/jwt-auth/src/lib/jwt-auth.providers.ts","../../../projects/jwt-auth/src/lib/jwt-auth.module.ts","../../../projects/jwt-auth/src/public-api.ts","../../../projects/jwt-auth/src/devlearning-jwt-auth.ts"],"sourcesContent":["export class JwtTokenBase {\r\n username: string | undefined;\r\n accessToken: string | undefined;\r\n expiresIn: number | undefined;\r\n refreshToken: string | undefined;\r\n refreshTokenExpiresIn: number | undefined;\r\n}","export class JwtResponseError extends Error {\r\n\r\n private _message: string;\r\n private _detailedMessage: string;\r\n private _status?: number;\r\n\r\n public get message() { return this._message; }\r\n public get detailedMessage() { return this._detailedMessage; }\r\n public get status() { return this._status; }\r\n public get isUnhautorized() { return this._status == 401; }\r\n\r\n constructor(message: string, detailedMessage: string, status: number = null) {\r\n super(message);\r\n this._message = message;\r\n this._detailedMessage = detailedMessage;\r\n this._status = status;\r\n Object.setPrototypeOf(this, JwtResponseError.prototype);\r\n }\r\n}","export enum StorageType {\r\n SESSION_STORAGE = 1,\r\n LOCAL_STORAGE = 2,\r\n}","import { JwtAuthLogLevel } from \"./jwt-auth-log-level\";\r\nimport { JwtTokenBase } from \"./jwt-token-base\";\r\nimport { StorageType } from \"./storage-type\";\r\n\r\nexport class JwtAuthConfig {\r\n tokenUrl: string;\r\n refreshUrl: string;\r\n useManualInitialization: boolean;\r\n logLevel: JwtAuthLogLevel;\r\n storageType?: StorageType;\r\n refreshTokenRequestFactory?: (token: JwtTokenBase) => object;\r\n}","export enum JwtAuthLogLevel {\r\n VERBOSE = 1,\r\n INFO = 2,\r\n WARNING = 3,\r\n ERROR = 4,\r\n NONE = 5\r\n}","export class TokenRequest {\r\n username: string;\r\n password: string;\r\n}","export class RefreshTokenRequest {\r\n username: string;\r\n refreshToken: string;\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { JwtAuthConfig } from './models/jwt-auth-config';\r\n\r\nexport const JWT_AUTH_CONFIG = new InjectionToken<JwtAuthConfig>('JWT_AUTH_CONFIG');","export const ERROR_INVALID_TOKEN = 'invalid_token';\r\nexport const ERROR_EXPIRED_REFRESH_TOKEN = 'expired_refresh_token';\r\n\r\nexport class WWWAuthenticateMessage {\r\n scheme: string;\r\n message: string;\r\n error: string;\r\n description: string;\r\n\r\n constructor(message: string, error: string, description: string) {\r\n this.scheme = \"Bearer\";\r\n this.message = message;\r\n this.error = error;\r\n this.description = description;\r\n }\r\n}\r\n\r\nexport class WWWAuthenticateMessageFactory {\r\n public static create(content: string) {\r\n if (content == null) return <WWWAuthenticateMessage>null;\r\n\r\n if (!content.toLowerCase().startsWith(\"bearer\")) throw new Error(\"Unmanaged scheme authentication\");\r\n\r\n //Bearer error=\"invalid_token\", error_description=\"The token expired at '07/25/2023 08:05:20'\"\r\n let message = content;\r\n const parts = content.substring(\"bearer \".length).split(',');\r\n let error = null;\r\n let description = null;\r\n\r\n parts.forEach(part => {\r\n part = part.trim();\r\n if (part.startsWith(\"error=\")) {\r\n error = part.split('=')[1].replaceAll(\"\\\"\", '').replaceAll(',', '');\r\n } else if (part.startsWith(\"error_description=\")) {\r\n description = part.split('=')[1].replaceAll(\"\\\"\", '').replaceAll(',', '');\r\n }\r\n });\r\n return new WWWAuthenticateMessage(message, error, description);\r\n }\r\n}\r\n\r\n/*\r\nhttps://www.rfc-editor.org/rfc/rfc6750#section-3\r\n\r\ninvalid_request\r\n The request is missing a required parameter, includes an\r\n unsupported parameter or parameter value, repeats the same\r\n parameter, uses more than one method for including an access\r\n token, or is otherwise malformed. The resource server SHOULD\r\n respond with the HTTP 400 (Bad Request) status code.\r\n\r\ninvalid_token\r\n The access token provided is expired, revoked, malformed, or\r\n invalid for other reasons. The resource SHOULD respond with\r\n the HTTP 401 (Unauthorized) status code. The client MAY\r\n request a new access token and retry the protected resource\r\n request.\r\n\r\ninsufficient_scope\r\n The request requires higher privileges than provided by the\r\n access token. The resource server SHOULD respond with the HTTP\r\n 403 (Forbidden) status code and MAY include the \"scope\"\r\n attribute with the scope necessary to access the protected\r\n resource.\r\n*/","import { Inject, Injectable } from '@angular/core';\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, BehaviorSubject, throwError, of } from 'rxjs';\r\nimport { tap, catchError, filter, take, finalize, switchMap, exhaustMap } from 'rxjs/operators';\r\nimport { JwtTokenBase } from './models/jwt-token-base';\r\nimport { JwtAuthConfig } from './models/jwt-auth-config';\r\nimport { RefreshTokenRequest } from './models/refresh-token-request';\r\nimport { JWT_AUTH_CONFIG } from './jwt-auth-config.injector';\r\nimport { JwtResponseError } from './models/jwt-response-error';\r\nimport { MutexFastLockService } from '@devlearning/mutex-fast-lock';\r\nimport { JwtAuthLogLevel } from './models/jwt-auth-log-level';\r\nimport { StorageType } from '../public-api';\r\nimport { ERROR_EXPIRED_REFRESH_TOKEN, WWWAuthenticateMessageFactory } from './models/www-authenticate-message';\r\n\r\n\r\nconst JWT_AUTH_KEY_STORAGE: string = \"jwt-auth\";\r\nconst TOKEN_KEY_STORAGE: string = JWT_AUTH_KEY_STORAGE + \"-token\";\r\nconst REFRESHING_KEY_STORAGE: string = JWT_AUTH_KEY_STORAGE + \"-refreshing\";\r\nconst REFRESHING_EVENT_CHANGED: string = JWT_AUTH_KEY_STORAGE + \"-refreshing-changed\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JwtAuthService<Token extends JwtTokenBase> {\r\n\r\n private _isLoggedInSubject: BehaviorSubject<boolean>;\r\n private _isRefreshingTokenSubject: BehaviorSubject<boolean>;\r\n private _jwtTokenSubject: BehaviorSubject<Token | null>;\r\n private _isLocalStorageSupported: boolean = false;\r\n private _refreshTokenSubject: BehaviorSubject<Token | null>;\r\n private _storage: Storage;\r\n\r\n /** Emits whenever the login state changes. */\r\n public get isLoggedIn$() {\r\n return this._isLoggedInSubject.asObservable();\r\n }\r\n\r\n /** Emits whenever the current token changes (null when logged out). */\r\n public get jwtToken$() {\r\n return this._jwtTokenSubject.asObservable();\r\n }\r\n\r\n /** Emits `true` while a token refresh is in progress. */\r\n public get refreshingToken$() {\r\n return this._isRefreshingTokenSubject.asObservable();\r\n }\r\n\r\n /** Current login state (synchronous). */\r\n public get isLoggedIn() { return this._isLoggedInSubject.value; }\r\n /** Current token (synchronous). `null` when logged out. */\r\n public get jwtToken() { return this._jwtTokenSubject.value; }\r\n\r\n constructor(\r\n @Inject(JWT_AUTH_CONFIG) private readonly _config: JwtAuthConfig,\r\n private readonly _http: HttpClient,\r\n private readonly _mutexFastLock: MutexFastLockService,\r\n ) {\r\n this._isLoggedInSubject = new BehaviorSubject<boolean>(false);\r\n this._isRefreshingTokenSubject = new BehaviorSubject<boolean>(false);\r\n this._jwtTokenSubject = new BehaviorSubject<Token | null>(null);\r\n this._refreshTokenSubject = new BehaviorSubject<Token | null>(null);\r\n\r\n if (this._config.storageType == StorageType.SESSION_STORAGE) {\r\n this._storage = sessionStorage;\r\n } else {\r\n this._storage = localStorage;\r\n }\r\n\r\n this._isLocalStorageSupported = this._checkStorageIsSupported();\r\n this._getLocalStorageSupported();\r\n this.setRefreshingToken(false);\r\n\r\n var that = this;\r\n window.addEventListener('storage', function (ev) {\r\n if (ev.key === TOKEN_KEY_STORAGE) {\r\n if (that._config.logLevel <= JwtAuthLogLevel.VERBOSE)\r\n console.debug(\"JwtAuth - eventListener storage token changed\");\r\n\r\n let token = <Token | null>JSON.parse(ev.newValue ?? 'null');\r\n if (token?.accessToken != that.jwtToken?.accessToken) {\r\n that._setToken(token as Token);\r\n that._refreshTokenSubject.next(token);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Restores the session from storage. If the access token is expired but the\r\n * refresh token is still valid, a refresh is attempted automatically.\r\n * Call this manually when `useManualInitialization` is `true`.\r\n */\r\n public init() {\r\n return of(this._getJwtToken())\r\n .pipe(\r\n exhaustMap(jwtToken => {\r\n if (jwtToken != null && jwtToken.accessToken != null) {\r\n this._jwtTokenSubject.next(jwtToken);\r\n if (!this.isTokenExpired()) {\r\n if (this._config.logLevel <= JwtAuthLogLevel.VERBOSE)\r\n console.debug(\"JwtAuth - init - isTokenExpired: false\");\r\n\r\n this._setToken(jwtToken);\r\n return of(jwtToken);\r\n } else if (!this.isRefreshTokenExpired()) {\r\n if (this._config.logLevel <= JwtAuthLogLevel.VERBOSE)\r\n console.debug(\"JwtAuth - init - isRefreshTokenExpired: false\");\r\n\r\n return this.refreshToken()\r\n .pipe(\r\n catchError((err, obs) => {\r\n this.logout();\r\n return this._handleError(err);\r\n })\r\n );\r\n } else {\r\n if (this._config.logLevel <= JwtAuthLogLevel.VERBOSE)\r\n console.debug(\"JwtAuth - init - token and refresh token is expired\");\r\n\r\n this.logout();\r\n return of(null);\r\n }\r\n } else {\r\n if (this._config.logLevel <= JwtAuthLogLevel.VERBOSE)\r\n console.debug(\"JwtAuth - init - token is null\");\r\n\r\n this.logout();\r\n return of(null);\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Authenticates the user by posting `request` to `tokenUrl`.\r\n * On success the token is persisted to storage and reactive state is updated.\r\n *\r\n * @param request The login request body. Use the generic parameter `TRequest`\r\n * to get full type-safety for your specific API contract.\r\n */\r\n public token<TRequest = object>(request: TRequest): Observable<Token> {\r\n return this._http.post<Token>(this._config.tokenUrl, request).pipe(\r\n tap(x => {\r\n this._setToken(x)\r\n }),\r\n catchError(err => {\r\n this._cleanToken();\r\n return this._handleError(err);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Refreshes the access token using the stored refresh token.\r\n * Concurrent calls are serialized with a mutex so only one HTTP request is\r\n * made; other callers wait and receive the same result.\r\n *\r\n * The request body is built by `refreshTokenRequestFactory` (if configured)\r\n * or falls back to `{ username, refreshToken }`.\r\n */\r\n public refreshToken(): Observable<Token> {\r\n if (this._jwtTokenSubject.value == null || this._jwtTokenSubject.value.accessToken == null) {\r\n if (this._config.logLevel <= JwtAuthLogLevel.ERROR)\r\n console.error(\"JwtAuth - refreshToken this._jwtTokenSubject.value was null\");\r\n return throwError(() => new Error(\"User is logged out\"));\r\n }\r\n\r\n if (this._config.logLevel <= JwtAuthLogLevel.VERBOSE)\r\n console.debug(\"JWT refreshToken\");\r\n\r\n return this._mutexFastLock.lock(REFRESHING_KEY_STORAGE, 100)\r\n .pipe(\r\n switchMap(x => {\r\n if (!this.getIsRefreshingToken()) {\r\n this.setRefreshingToken(true);\r\n\r\n return this._mutexFastLock.lock(TOKEN_KEY_STORAGE)\r\n .pipe(\r\n tap(x => this._refreshTokenSubject.next(null)),\r\n tap(x => this._isRefreshingTokenSubject.next(true)),\r\n switchMap(x => {\r\n let jwtToken = this._getJwtToken();\r\n let request: object;\r\n if (this._config.refreshTokenRequestFactory) {\r\n request = this._config.refreshTokenRequestFactory(jwtToken ?? new JwtTokenBase());\r\n } else {\r\n const defaultRequest = new RefreshTokenRequest();\r\n defaultRequest.username = jwtToken?.username ?? '';\r\n defaultRequest.refreshToken = jwtToken?.refreshToken ?? '';\r\n request = defaultRequest;\r\n }\r\n return this._http.post<Token>(this._config.refreshUrl, request)\r\n .pipe(\r\n tap(x => {\r\n this._setToken(x)\r\n this._refreshTokenSubject.next(x);\r\n }),\r\n catchError(err => {\r\n if (this._config.logLevel <= JwtAuthLogLevel.VERBOSE)\r\n console.debug(\"JWT refreshToken err \" + err);\r\n if (err.message && err.message.indexOf(\"Lock could not be acquired\") >= 0) {\r\n return this._refreshTokenSubject\r\n .pipe(\r\n filter(x => x != null),\r\n filter(x => !this._checkTokenIsExpired(x as Token)),\r\n take(1)\r\n );\r\n } else {\r\n if (err.status == 468) {\r\n return throwError(() => new Error(\"Refresh token expired\"));\r\n } else if (err.status == 401) {\r\n const wwwAuthenticate = WWWAuthenticateMessageFactory.create(err.headers.get('WWW-Authenticate'));\r\n if (wwwAuthenticate.error == ERROR_EXPIRED_REFRESH_TOKEN) {\r\n this._cleanToken();\r\n return throwError(() => new Error(\"Refresh token expired\"));\r\n }\r\n return throwError(() => new Error(\"Unauthorized\"));\r\n } else {\r\n this._cleanToken();\r\n return this._handleError(err);\r\n }\r\n }\r\n }),\r\n finalize(() => {\r\n this.setRefreshingToken(false);\r\n this._mutexFastLock.release(TOKEN_KEY_STORAGE);\r\n this._mutexFastLock.release(REFRESHING_KEY_STORAGE);\r\n this._isRefreshingTokenSubject.next(false);\r\n })\r\n );\r\n })\r\n )\r\n } else {\r\n return this._refreshTokenSubject\r\n .pipe(\r\n filter(x => x != null),\r\n filter(x => !this._checkTokenIsExpired(x)),\r\n take(1)\r\n );\r\n }\r\n }),\r\n catchError((err) => {\r\n this._mutexFastLock.release(REFRESHING_KEY_STORAGE);\r\n if (err.message && err.message.indexOf(\"Lock could not be acquired\") >= 0) {\r\n return this._refreshTokenSubject\r\n .pipe(\r\n filter(x => x != null),\r\n filter(x => !this._checkTokenIsExpired(x)),\r\n take(1)\r\n )\r\n } else {\r\n return throwError(() => new Error(err));\r\n }\r\n })\r\n );\r\n }\r\n\r\n /** Clears the stored token and emits the logged-out state. */\r\n public logout() {\r\n this._cleanToken();\r\n }\r\n\r\n /** Returns `true` if `url` is one of the authentication endpoints (token or refresh). */\r\n public isAuthenticationUrl(url: string): boolean {\r\n return url == this._config.tokenUrl || url == this._config.refreshUrl;\r\n }\r\n\r\n /** Returns `true` if the refresh token has passed its expiry timestamp. */\r\n public isRefreshTokenExpired() {\r\n return new Date().getTime() > (this._jwtTokenSubject.value?.refreshTokenExpiresIn ?? 0);\r\n }\r\n\r\n /** Returns `true` if the access token has passed its expiry timestamp. */\r\n public isTokenExpired() {\r\n return this._checkTokenIsExpired(this._jwtTokenSubject.value as Token);\r\n }\r\n\r\n /** Overrides the token URL at runtime. */\r\n public setTokenUrl(url: string) {\r\n this._config.tokenUrl = url;\r\n }\r\n\r\n /** Overrides the refresh URL at runtime. */\r\n public setRefreshUrl(url: string) {\r\n this._config.refreshUrl = url;\r\n }\r\n\r\n private getIsRefreshingToken() {\r\n return this._storage.getItem(REFRESHING_KEY_STORAGE) == 'true';\r\n }\r\n\r\n private setRefreshingToken(refreshing: boolean) {\r\n this._storage.setItem(REFRESHING_KEY_STORAGE, '' + refreshing);\r\n }\r\n\r\n /** Manually sets a token, persisting it to storage and updating reactive state. */\r\n public setToken(jwtToken: Token) {\r\n this._setToken(jwtToken);\r\n }\r\n\r\n private _setToken(jwtToken: Token) {\r\n if (jwtToken != null) {\r\n this._saveJwtToken(jwtToken);\r\n this._isLoggedInSubject.next(true);\r\n this._jwtTokenSubject.next(jwtToken);\r\n } else {\r\n this._cleanToken();\r\n }\r\n }\r\n\r\n private _cleanToken() {\r\n this._deleteJwtToken();\r\n this._isLoggedInSubject.next(false);\r\n this._jwtTokenSubject.next(null);\r\n }\r\n\r\n private _checkStorageIsSupported() {\r\n try {\r\n this._storage.setItem(JWT_AUTH_KEY_STORAGE + '-test-storage', \"test\");\r\n this._storage.removeItem(JWT_AUTH_KEY_STORAGE + '-test-storage');\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n private _getLocalStorageSupported() {\r\n if (!this._isLocalStorageSupported) {\r\n if (this._config.logLevel <= JwtAuthLogLevel.ERROR)\r\n console.error(\"LocalStorage is not supported\");\r\n }\r\n return this._isLocalStorageSupported;\r\n }\r\n\r\n private _saveJwtToken(jwtToken: Token) {\r\n if (!this._isLocalStorageSupported) return;\r\n this._storage.setItem(TOKEN_KEY_STORAGE, JSON.stringify(jwtToken));\r\n }\r\n\r\n private _getJwtToken() {\r\n if (!this._isLocalStorageSupported) return undefined;\r\n return <Token>JSON.parse(this._storage.getItem(TOKEN_KEY_STORAGE) ?? 'null');\r\n }\r\n\r\n private _deleteJwtToken() {\r\n this._storage.removeItem(TOKEN_KEY_STORAGE);\r\n }\r\n\r\n private _checkTokenIsExpired(token: Token) {\r\n return new Date().getTime() > (token.expiresIn ?? 0);\r\n }\r\n\r\n private _handleError(error: any) {\r\n let message: string | undefined;\r\n let detailedMessage: string | undefined;\r\n if (error.error instanceof Error) {\r\n if (this._config.logLevel <= JwtAuthLogLevel.ERROR)\r\n console.error('An error occurred:', error.error.message);\r\n message = error.error.message;\r\n } else if (error instanceof HttpErrorResponse) {\r\n if (error.status == 500) {\r\n message = error.error?.message;\r\n detailedMessage = error.error?.detailedMessage;\r\n } else {\r\n console.error(`Backend returned code ${error.status}, body was: ${error.message}`);\r\n message = error.message;\r\n }\r\n }\r\n let jwtResponse = new JwtResponseError(message ?? '', detailedMessage ?? '', error.status);\r\n return throwError(() => jwtResponse);\r\n }\r\n}\r\n","import { inject, Inject, Injectable } from '@angular/core';\r\nimport { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpInterceptorFn, HttpRequest } from '@angular/common/http';\r\nimport { catchError, switchMap } from 'rxjs/operators';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { JwtAuthService } from './jwt-auth.service';\r\nimport { JwtAuthConfig } from './models/jwt-auth-config';\r\nimport { JwtAuthLogLevel } from './models/jwt-auth-log-level';\r\nimport { JwtTokenBase } from './models/jwt-token-base';\r\nimport { JWT_AUTH_CONFIG } from './jwt-auth-config.injector';\r\n\r\nfunction applyCredentials(req: HttpRequest<any>, token?: string | null) {\r\n if (!token) return req;\r\n return req.clone({ setHeaders: { Authorization: `Bearer ${token}` } });\r\n}\r\n\r\nexport const jwtAuthInterceptorFn: HttpInterceptorFn = (req, next): Observable<HttpEvent<unknown>> => {\r\n const config = inject(JWT_AUTH_CONFIG) as JwtAuthConfig;\r\n const jwtAuth = inject<JwtAuthService<JwtTokenBase>>(JwtAuthService as any);\r\n\r\n if (config.logLevel <= JwtAuthLogLevel.VERBOSE) {\r\n // evita di loggare token/headers\r\n console.debug('JwtAuthInterceptor', req.url);\r\n }\r\n\r\n // non toccare le chiamate di autenticazione\r\n if (jwtAuth.isAuthenticationUrl(req.url)) {\r\n return next(req);\r\n }\r\n\r\n const authedReq = applyCredentials(req, jwtAuth.jwtToken?.accessToken);\r\n\r\n return next(authedReq).pipe(\r\n catchError((error: unknown) => {\r\n // solo HttpErrorResponse ci interessa\r\n if (!(error instanceof HttpErrorResponse)) {\r\n return throwError(() => error);\r\n }\r\n\r\n switch (error.status) {\r\n case 401: {\r\n if (jwtAuth.jwtToken != null && jwtAuth.isLoggedIn) {\r\n // refresh e retry con nuovo access token\r\n return jwtAuth.refreshToken().pipe(\r\n switchMap(t => next(applyCredentials(req, t.accessToken)))\r\n );\r\n }\r\n return throwError(() => error);\r\n }\r\n\r\n default:\r\n return throwError(() => error);\r\n }\r\n })\r\n );\r\n};\r\n\r\n@Injectable()\r\nexport class JwtAuthInterceptor implements HttpInterceptor {\r\n constructor(\r\n private readonly jwtAuth: JwtAuthService<JwtTokenBase>,\r\n @Inject(JWT_AUTH_CONFIG) private readonly config: JwtAuthConfig,\r\n ) {}\r\n\r\n intercept(req: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\r\n if (this.config.logLevel <= JwtAuthLogLevel.VERBOSE) {\r\n console.debug('JwtAuthInterceptor', req.url);\r\n }\r\n\r\n if (this.jwtAuth.isAuthenticationUrl(req.url)) {\r\n return next.handle(req);\r\n }\r\n\r\n const authedReq = applyCredentials(req, this.jwtAuth.jwtToken?.accessToken);\r\n\r\n return next.handle(authedReq).pipe(\r\n catchError((error: unknown) => {\r\n if (!(error instanceof HttpErrorResponse)) {\r\n return throwError(() => error);\r\n }\r\n\r\n if (error.status === 401 && this.jwtAuth.jwtToken != null && this.jwtAuth.isLoggedIn) {\r\n return this.jwtAuth.refreshToken().pipe(\r\n switchMap(t => next.handle(applyCredentials(req, t.accessToken)))\r\n );\r\n }\r\n\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n}\r\n","import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { Observable, of } from 'rxjs';\r\nimport { JwtAuthService } from './jwt-auth.service';\r\nimport { catchError, mergeMap } from 'rxjs/operators';\r\nimport { JwtTokenBase } from '../public-api';\r\n\r\nexport class JwtAuthGuard<Token extends JwtTokenBase> {\r\n\r\n constructor(\r\n private readonly _jwtAuthService: JwtAuthService<Token>\r\n ) { }\r\n\r\n canActivateBase(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {\r\n if (this._jwtAuthService.jwtToken == null\r\n || this._jwtAuthService.isLoggedIn == null\r\n || !this._jwtAuthService.isLoggedIn\r\n || this._jwtAuthService.isRefreshTokenExpired()) { \r\n return of(false);\r\n } else if (this._jwtAuthService.isTokenExpired()) {\r\n return this._jwtAuthService.refreshToken()\r\n .pipe(\r\n mergeMap(x => of(true)),\r\n catchError(err => of(false))\r\n );\r\n } else {\r\n return of(true);\r\n }\r\n }\r\n}","import { EnvironmentProviders, makeEnvironmentProviders, importProvidersFrom, APP_INITIALIZER } from '@angular/core';\r\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { MutexFastLockModule } from '@devlearning/mutex-fast-lock';\r\nimport { JwtAuthService } from './jwt-auth.service';\r\nimport { JwtAuthConfig } from './models/jwt-auth-config';\r\nimport { JwtTokenBase } from './models/jwt-token-base';\r\nimport { JWT_AUTH_CONFIG } from './jwt-auth-config.injector';\r\nimport { jwtAuthInterceptorFn } from './jwt-auth.interceptor';\r\n\r\nexport function provideJwtAuth(config: JwtAuthConfig): EnvironmentProviders {\r\n const initializerProvider = {\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n useFactory: (svc: JwtAuthService<JwtTokenBase>) => () => firstValueFrom(svc.init()),\r\n deps: [JwtAuthService],\r\n };\r\n\r\n return makeEnvironmentProviders([\r\n importProvidersFrom(MutexFastLockModule),\r\n\r\n { provide: JWT_AUTH_CONFIG, useValue: config },\r\n\r\n provideHttpClient(withInterceptors([jwtAuthInterceptorFn])),\r\n\r\n ...(!config.useManualInitialization ? [initializerProvider] : []),\r\n ]);\r\n}\r\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { HTTP_INTERCEPTORS } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { MutexFastLockModule } from '@devlearning/mutex-fast-lock';\r\nimport { JwtAuthConfig } from './models/jwt-auth-config';\r\nimport { JwtAuthService } from './jwt-auth.service';\r\nimport { JwtTokenBase } from './models/jwt-token-base';\r\nimport { JWT_AUTH_CONFIG } from './jwt-auth-config.injector';\r\nimport { JwtAuthInterceptor } from './jwt-auth.interceptor';\r\n\r\n@NgModule({\r\n imports: [MutexFastLockModule],\r\n})\r\nexport class JwtAuthModule {\r\n static forRoot(config: JwtAuthConfig): ModuleWithProviders<JwtAuthModule> {\r\n const providers: any[] = [\r\n { provide: JWT_AUTH_CONFIG, useValue: config },\r\n { provide: HTTP_INTERCEPTORS, useClass: JwtAuthInterceptor, multi: true },\r\n ];\r\n\r\n if (!config.useManualInitialization) {\r\n providers.push({\r\n provide: APP_INITIALIZER,\r\n multi: true,\r\n useFactory: (svc: JwtAuthService<JwtTokenBase>) => () => firstValueFrom(svc.init()),\r\n deps: [JwtAuthService],\r\n });\r\n }\r\n\r\n return {\r\n ngModule: JwtAuthModule,\r\n providers,\r\n };\r\n }\r\n}\r\n","/*\r\n * Public API Surface of jwt-auth\r\n */\r\n\r\nexport * from './lib/models/jwt-token-base';\r\nexport * from './lib/models/jwt-response-error';\r\nexport * from './lib/models/storage-type';\r\nexport * from './lib/models/jwt-auth-config';\r\nexport * from './lib/models/jwt-auth-log-level';\r\nexport * from './lib/models/token-request';\r\nexport * from './lib/jwt-auth.service';\r\nexport * from './lib/jwt-auth.interceptor';\r\nexport * from './lib/jwt-auth.guard';\r\nexport * from './lib/jwt-auth.providers';\r\nexport * from './lib/jwt-auth.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}