From d2b2bc712d913c7b6dbdf5b5e0cf1fd4f88d6576 Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Tue, 30 Apr 2024 14:34:34 +0300 Subject: [PATCH] handle 401 authentication error in a new service --- .../lib/providers/error-handlers.provider.ts | 14 +++++---- .../authentication-error-handler.service.ts | 24 +++++++++++++++ .../theme-shared/src/lib/services/index.ts | 1 + .../services/session-error-handler.service.ts | 30 ------------------- 4 files changed, 33 insertions(+), 36 deletions(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/services/authentication-error-handler.service.ts delete mode 100644 npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts b/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts index b0c3e693b9..84e8fe9b19 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/providers/error-handlers.provider.ts @@ -1,10 +1,12 @@ import { Provider } from '@angular/core'; import { CUSTOM_ERROR_HANDLERS } from '../tokens'; -import { TenantResolveErrorHandlerService } from '../services/tenant-resolve-error-handler.service'; -import { AbpFormatErrorHandlerService } from '../services/abp-format-error-handler.service'; -import { StatusCodeErrorHandlerService } from '../services/status-code-error-handler.service'; -import { UnknownStatusCodeErrorHandlerService } from '../services/unknown-status-code-error-handler.service'; -import { AbpSessionErrorHandlerService } from '../services/session-error-handler.service'; +import { + TenantResolveErrorHandlerService, + AbpFormatErrorHandlerService, + StatusCodeErrorHandlerService, + UnknownStatusCodeErrorHandlerService, + AbpAuthenticationErrorHandler, +} from '../services'; export const DEFAULT_HANDLERS_PROVIDERS: Provider[] = [ { @@ -30,6 +32,6 @@ export const DEFAULT_HANDLERS_PROVIDERS: Provider[] = [ { provide: CUSTOM_ERROR_HANDLERS, multi: true, - useExisting: AbpSessionErrorHandlerService, + useExisting: AbpAuthenticationErrorHandler, }, ]; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/authentication-error-handler.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/authentication-error-handler.service.ts new file mode 100644 index 0000000000..602514bee8 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/authentication-error-handler.service.ts @@ -0,0 +1,24 @@ +import { inject, Injectable } from '@angular/core'; +import { AuthService, ConfigStateService } from '@abp/ng.core'; +import { HttpErrorResponse } from '@angular/common/http'; +import { CustomHttpErrorHandlerService } from '../models/common'; +import { CUSTOM_HTTP_ERROR_HANDLER_PRIORITY } from '../constants/default-errors'; + +@Injectable({ providedIn: 'root' }) +export class AbpAuthenticationErrorHandler implements CustomHttpErrorHandlerService { + readonly priority = CUSTOM_HTTP_ERROR_HANDLER_PRIORITY.veryHigh; + protected readonly authService = inject(AuthService); + protected readonly configStateService = inject(ConfigStateService); + + canHandle(error: unknown): boolean { + return error instanceof HttpErrorResponse && error.status === 401; + } + + execute() { + this.configStateService.refreshAppState().subscribe(({ currentUser }) => { + if (!currentUser.isAuthenticated) { + this.authService.logout(); + } + }); + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts index 41f1b84039..521d86b9c2 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/index.ts @@ -9,3 +9,4 @@ export * from './tenant-resolve-error-handler.service'; export * from './status-code-error-handler.service'; export * from './unknown-status-code-error-handler.service'; export * from './router-error-handler.service'; +export * from './authentication-error-handler.service' diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts deleted file mode 100644 index 3ba7c7aa76..0000000000 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/session-error-handler.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { inject, Injectable } from '@angular/core'; -import { AuthService } from '@abp/ng.core'; -import { HttpErrorResponse } from '@angular/common/http'; -import { getErrorFromRequestBody } from '../utils/error.utils'; -import { CustomHttpErrorHandlerService } from '../models/common'; -import { ConfirmationService } from '../services/confirmation.service'; -import { CUSTOM_HTTP_ERROR_HANDLER_PRIORITY } from '../constants/default-errors'; - -@Injectable({ providedIn: 'root' }) -export class AbpSessionErrorHandlerService implements CustomHttpErrorHandlerService { - readonly priority = CUSTOM_HTTP_ERROR_HANDLER_PRIORITY.high; - private authService = inject(AuthService); - - canHandle(error: unknown): boolean { - console.log(error); - debugger; - if ( - error instanceof HttpErrorResponse && - error.headers.get('expires') && - error.headers.get('pragma') - ) { - return true; - } - return false; - } - - execute() { - this.authService.logout(); - } -}