Files
DotNetAngular/src/ClientApp/src/app/presentation/interceptors/token.interceptor.ts
T

76 lines
2.3 KiB
TypeScript

import {HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest} from '@angular/common/http';
import {inject} from "@angular/core";
import {AuthService} from "../../infrastructure/services/auth-service";
import {catchError, Observable, switchMap, throwError} from "rxjs";
import {ToastService} from "../../infrastructure/services/toast.service";
import {Router} from '@angular/router';
import {RefreshTokenRequest} from "../models/refresh-token-request";
export const tokenInterceptor: HttpInterceptorFn = (req, next) => {
const authService = inject(AuthService);
const token = authService.getToken();
const toastService = inject(ToastService);
const router = inject(Router);
if (token) {
req = req.clone({
setHeaders: {Authorization: `Bearer ${token}`}
});
}
return next(req).pipe(
catchError((err: any) => {
if (err instanceof HttpErrorResponse) {
if (err.status === 401) {
return handleUnAuthorizedError(req, next, authService, router, toastService);
}
}
console.log("interceptor error",err.error?.error?.message);
return throwError(() => err);
})
);
};
function handleUnAuthorizedError(
req: HttpRequest<any>,
next: HttpHandlerFn,
authenticateService: AuthService,
router: Router,
toastService: ToastService
): Observable<HttpEvent<any>> {
const refreshTokenRequest = new RefreshTokenRequest();
refreshTokenRequest.refreshToken = authenticateService.getRefreshToken()!;
refreshTokenRequest.userId = authenticateService.getUserIdFromToken()!;
return authenticateService.renewToken(refreshTokenRequest).pipe(
switchMap((data) => {
const tokenResponse = data.value;
authenticateService.storeRefreshToken(tokenResponse.refreshToken);
authenticateService.storeToken(tokenResponse.accessToken);
req = req.clone({
setHeaders: {Authorization: `Bearer ${tokenResponse.accessToken}`}
});
return next(req);
}),
catchError((err) => {
return throwError(() => {
authenticateService.signOut();
router.navigate(['login']).then(success => {
if (success) {
toastService.show(err.error?.error?.message ||'Token is expired, login again!', {
classname: 'bg-warning text-light',
delay: 2000
});
}
})
});
})
);
}