Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  1. import {HttpHandler, HttpHeaders, HttpInterceptor, HttpRequest} from '@angular/common/http';
  2. import {Observable, of, Subject, throwError} from 'rxjs';
  3. import {catchError, switchMap, take, tap} from 'rxjs/operators';
  4. import {environment} from '../../environments/environment';
  5. import {AuthTokens} from './model/auth-token';
  6. import {Injectable} from '@angular/core';
  7. import {AuthTokenService} from './services/auth-token.service';
  8. import {AppState} from '../store/app.reducers';
  9. import {select, Store} from '@ngrx/store';
  10. import {Logout, RefreshTokenSuccess} from './store/auth.actions';
  11. import {selectAuthToken} from './store/auth.reducer';
  12. import {OauthParameters} from './config/oauth-parameters';
  13.  
  14. @Injectable()
  15. export class AuthInterceptor implements HttpInterceptor {
  16.  
  17. refreshTokenInProgress = false;
  18. tokenRefreshedSource = new Subject();
  19. tokenRefreshed$ = this.tokenRefreshedSource.asObservable();
  20.  
  21. constructor(private authService: AuthTokenService,
  22. private store$: Store<AppState>,
  23. private oauthParameters: OauthParameters) {
  24. }
  25.  
  26. intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> {
  27. return this.store$.pipe(
  28. take(1),
  29. select(selectAuthToken),
  30. switchMap((token: AuthTokens) => {
  31. return next.handle(this.addAuthHeaders(request, token)).pipe(
  32. catchError((error) => {
  33. if (error.status === 401) {
  34. return this.refreshToken(token.refresh_token).pipe(
  35. switchMap((newToken: AuthTokens) => {
  36. return next.handle(this.addAuthHeaders(request, newToken));
  37. }), catchError(() => {
  38. this.store$.dispatch(new Logout());
  39. return of();
  40. }));
  41. }
  42. return throwError(error);
  43. }));
  44. })
  45. );
  46. }
  47.  
  48. private refreshToken(refreshToken) {
  49. if (this.refreshTokenInProgress) {
  50. return new Observable(observer => {
  51. this.tokenRefreshed$
  52. .subscribe(() => {
  53. observer.next();
  54. observer.complete();
  55. });
  56. });
  57. } else {
  58. this.refreshTokenInProgress = true;
  59. return this.authService.refreshToken(refreshToken)
  60. .pipe(
  61. tap(token => {
  62. this.authService.token = token;
  63. this.store$.dispatch(new RefreshTokenSuccess(token));
  64. this.refreshTokenInProgress = false;
  65. this.tokenRefreshedSource.next();
  66. })
  67. );
  68. }
  69. }
  70.  
  71. private isBackendUrl(request: HttpRequest<any>) {
  72. return request.url.substr(0, environment.restUrl.length) == environment.restUrl;
  73. }
  74.  
  75. private isTokenEndpoint(request: HttpRequest<any>) {
  76. const url = request.url.replace(environment.restUrl, '');
  77. return url == '/token';
  78. }
  79.  
  80. addAuthHeaders(request: HttpRequest<any>, token: AuthTokens) {
  81. if (this.isBackendUrl(request)) {
  82. const url: string = request.url.replace(environment.restUrl, '');
  83. const basic = this.oauthParameters.clientId + ':' + this.oauthParameters.clientSecret;
  84. const authHeader = (url === '/token') ? ('Basic ' + btoa(basic)) : ('Bearer ' + token.access_token);
  85. let modifiedHeaders;
  86.  
  87. if (url === '/token') {
  88. modifiedHeaders = new HttpHeaders()
  89. .set('Authorization', authHeader)
  90. .set('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
  91. } else {
  92. modifiedHeaders = new HttpHeaders()
  93. .set('Authorization', authHeader);
  94. }
  95. if (request.headers.get('content-type') == null) {
  96. modifiedHeaders.append('Content-Type', 'application/json');
  97. } else {
  98. modifiedHeaders.append('Content-Type', request.headers.get('content-type'));
  99. }
  100. return request.clone({headers: modifiedHeaders});
  101. }
  102.  
  103. return request;
  104. }
  105.  
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement