Untitled
unknown
typescript
a year ago
2.1 kB
6
Indexable
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable, catchError, switchMap, throwError } from 'rxjs'; import { AuthService } from './auth.service'; @Injectable({ providedIn: 'root' }) export class AuthInterceptorService implements HttpInterceptor { constructor(private authService: AuthService) { } intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { console.log("Interceptor - interceptor request."); const accessToken = this.authService.getAccessToken(); if (accessToken) { request = this.addToken(request, accessToken); } return next.handle(request).pipe( catchError((error) => { console.error("Interception Error: ", error); if (error.status === 401 && accessToken) { console.log('Interceptor - handling 401 error'); return this.handle401Error(request, next, accessToken); } return throwError(error); }) ) } addToken(request: HttpRequest<any>, accessToken: string): HttpRequest<any> { return request.clone({ setHeaders: { Authorization: `Bearer ${accessToken}` } }); } handle401Error(request: HttpRequest<any>, next: HttpHandler, accessToken: string): Observable<HttpEvent<any>> { const refreshToken = this.authService.getRefreshToken(); if (!refreshToken) { this.authService.logout(); return throwError("No refresh token available."); } return this.authService.refreshTokens(accessToken, refreshToken).pipe( switchMap((response) => { if (response.accessToken) { request = this.addToken(request, response.accessToken); return next.handle(request); } else { this.authService.logout(); return throwError("token refresh failed"); } }), catchError((error) => { this.authService.logout(); return throwError(error); })); } }
Editor is loading...
Leave a Comment