token.interceptor.ts 2.5 KB

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