Untitled
unknown
typescript
2 years ago
2.1 kB
18
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