File

projects/prestations-ng/src/sdk-redirect/iam-expired-interceptor.service.ts

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()
Returns : void

Properties

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);
    }
}

results matching ""

    No results matching ""