| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import { Injectable } from '@angular/core';
- import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse } from '@angular/common/http';
- import { AuthService } from '@app/services/auth2.service';
- import { Observable, throwError, BehaviorSubject } from 'rxjs';
- import { catchError, filter, take, switchMap } from 'rxjs/operators';
- @Injectable()
- export class TokenInterceptor implements HttpInterceptor {
- private isRefreshing = false;
- private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
- constructor(public authService: AuthService) { }
- intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
- if (request.url.indexOf("auth/refresh")!= -1){
- request = this.addToken(request, this.authService.getRefreshToken());
- }
- else if (request.url.indexOf("openweather")!= -1){
- request;
- }
- else {
- if (this.authService.getJwtToken()) {
- request = this.addToken(request, this.authService.getJwtToken());
- }
- }
-
- return next.handle(request).pipe(catchError(error => {
- // Erase storage if response code from auth refresh gives 401 or 422 error
- if (request.url.indexOf("auth/refresh")!= -1 && error instanceof HttpErrorResponse){
- this.authService.removeTokens();
- window.location.href="#/login";
- }
- if (error instanceof HttpErrorResponse && (error.status === 401 || error.status === 422)) {
- return this.handle4xxError(request, next);
- }
- else {
- return throwError(error);
- }
- }));
- }
- private addToken(request: HttpRequest<any>, token: string) {
- return request.clone({
- setHeaders: {
- 'Authorization': `Bearer ${token}`
- }
- });
- }
- // Cuando el endpoint devuelva 401 debe mandarlo al login y destruir las variables del storage
- private handle4xxError(request: HttpRequest<any>, next: HttpHandler) {
- if (!this.isRefreshing) {
- this.isRefreshing = true;
- this.refreshTokenSubject.next(null);
- return this.authService.refreshToken().pipe(
- switchMap((token: any) => {
- this.isRefreshing = false;
- this.refreshTokenSubject.next(token["data"]["access_token"]);
- return next.handle(this.addToken(request, token["data"]["access_token"]));
- }));
-
- } else {
- return this.refreshTokenSubject.pipe(
- filter(token => token != null),
- take(1),
- switchMap(jwt => {
- return next.handle(this.addToken(request, jwt));
- }));
- }
- }
- }
|