token.interceptor.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { Injectable } from '@angular/core';
  2. import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse } from '@angular/common/http';
  3. import { AuthService } from '@app/services/auth2.service';
  4. import { Observable, throwError, BehaviorSubject } from 'rxjs';
  5. import { catchError, filter, take, switchMap } from 'rxjs/operators';
  6. import Swal from 'sweetalert2';
  7. @Injectable()
  8. export class TokenInterceptor implements HttpInterceptor {
  9. private isRefreshing = false;
  10. private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
  11. constructor(public authService: AuthService) { }
  12. intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  13. if (request.url.indexOf("auth/refresh")!= -1 || request.url.indexOf("auth/logout2") != -1){
  14. request = this.addToken(request, this.authService.getRefreshToken());
  15. }
  16. else if (request.url.indexOf("openweather")!= -1 ){
  17. request;
  18. }
  19. else {
  20. if (this.authService.getJwtToken()) {
  21. request = this.addToken(request, this.authService.getJwtToken());
  22. }
  23. }
  24. return next.handle(request).pipe(catchError(error => {
  25. // Erase storage if response code from auth refresh gives 401 or 422 error
  26. if (request.url.indexOf("auth/refresh")!= -1 && error instanceof HttpErrorResponse){
  27. Swal.fire({
  28. });
  29. this.authService.removeTokens();
  30. setTimeout(function(){
  31. Swal.close();
  32. window.location.href = "#/login";
  33. }, 2000);
  34. }
  35. if (error instanceof HttpErrorResponse && (error.status === 401 || error.status === 422)) {
  36. return this.handle4xxError(request, next);
  37. }
  38. else {
  39. return throwError(error);
  40. }
  41. }));
  42. }
  43. private addToken(request: HttpRequest<any>, token: string) {
  44. return request.clone({
  45. setHeaders: {
  46. 'Authorization': `Bearer ${token}`
  47. }
  48. });
  49. }
  50. // Cuando el endpoint devuelva 401 debe mandarlo al login y destruir las variables del storage
  51. private handle4xxError(request: HttpRequest<any>, next: HttpHandler) {
  52. if (!this.isRefreshing) {
  53. this.isRefreshing = true;
  54. this.refreshTokenSubject.next(null);
  55. return this.authService.refreshToken().pipe(
  56. switchMap((token: any) => {
  57. this.isRefreshing = false;
  58. this.refreshTokenSubject.next(token["data"]["access_token"]);
  59. return next.handle(this.addToken(request, token["data"]["access_token"]));
  60. }));
  61. } else {
  62. this.isRefreshing = false;
  63. return this.refreshTokenSubject.pipe(
  64. filter(token => token != null),
  65. take(2),
  66. switchMap(jwt => {
  67. return next.handle(this.addToken(request, jwt));
  68. }));
  69. }
  70. }
  71. }