token.interceptor.ts 2.9 KB

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