File
Index
Properties
|
|
Methods
|
|
Accessors
|
|
Methods
Private
handleError
|
handleError(err: HttpErrorResponse | HttpEvent)
|
|
Parameters :
Name |
Type |
Optional |
err |
HttpErrorResponse | HttpEvent<any>
|
No
|
Returns : Observable<HttpEvent<any>>
|
intercept
|
intercept(req: HttpRequest, next: HttpHandler)
|
|
Parameters :
Name |
Type |
Optional |
req |
HttpRequest<any>
|
No
|
next |
HttpHandler
|
No
|
Returns : Observable<HttpEvent | any>
|
setIamSessionExpiredManually
|
setIamSessionExpiredManually()
|
|
|
Private
_isIamSessionExpired
|
Type : Subject<boolean>
|
Default value : new BehaviorSubject<boolean>(false)
|
|
Accessors
isIamSessionExpired
|
getisIamSessionExpired()
|
|
import {
HttpErrorResponse,
HttpEvent,
HttpHandler,
HttpInterceptor,
HttpRequest,
HttpResponseBase,
HttpStatusCode
} from '@angular/common/http';
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable, Subject, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
const IAM_SESSION_EXPIRED_HEADER = 'iam-session-expired';
const CYBER_LOGIN_PATH = '/100018/login';
const ACV_LOGIN_PATH = '/iamlogin';
const hasIamExpiredHeader = (event: HttpResponseBase): boolean =>
!!event.headers.get(IAM_SESSION_EXPIRED_HEADER);
const isRedirectionToLogin = (event: HttpResponseBase): boolean => {
const isRedirection = event.status === HttpStatusCode.Found;
const locationHeader = event.headers.get('Location');
const isLocationCyberLogin = locationHeader?.includes(CYBER_LOGIN_PATH);
const isLocationAcvLogin = locationHeader?.includes(ACV_LOGIN_PATH);
return isRedirection && (isLocationCyberLogin || isLocationAcvLogin);
};
@Injectable({
providedIn: 'root'
})
export class IamExpiredInterceptorService implements HttpInterceptor {
private _isIamSessionExpired: Subject<boolean> =
new BehaviorSubject<boolean>(false);
get isIamSessionExpired(): Observable<boolean> {
return this._isIamSessionExpired.asObservable();
}
setIamSessionExpiredManually(): void {
this._isIamSessionExpired.next(true);
}
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any> | any> {
return next.handle(req).pipe(
map(event => {
if (event instanceof HttpResponseBase) {
if (
hasIamExpiredHeader(event) ||
isRedirectionToLogin(event)
) {
this._isIamSessionExpired.next(true);
}
}
return event;
}),
catchError(this.handleError.bind(this))
);
}
private handleError(
err: HttpErrorResponse | HttpEvent<any>
): Observable<HttpEvent<any>> {
if (err instanceof HttpErrorResponse) {
// login page is returned when xml/json is expected
const isUrlCyberLogin = err.url.includes(CYBER_LOGIN_PATH);
const isUrlAcvLogin = err.url.includes(ACV_LOGIN_PATH);
const isBeneficiaryRequired =
err.status === 401 &&
err.error &&
err.error.code === 'BENEFICIARY_REQUIRED';
if (isUrlCyberLogin || isUrlAcvLogin || isBeneficiaryRequired) {
this._isIamSessionExpired.next(true);
}
}
return throwError(() => err);
}
}