src/lib/auth.interceptor.ts
        
Interceptor to decorate requests with Access token
                                    constructor(config: AuthConfig, cryptrClient: any)
                                 | 
                            
| intercept | 
            intercept(req: HttpRequest
                                 | 
                            
| 
                                         
                                            Returns:      
                                            any
            
                                         | 
                            
| Private stripQueryFrom | 
                                        
                                    stripQueryFrom(uri: string)
                                 | 
                            
| 
                                         
                                            Returns:      
                                            string
            
                                         | 
                            
| Private canAttachToken | 
                                        
                                    canAttachToken(route: ApiRouteDefinition, request: HttpRequest
                                 | 
                            
| 
                                         
                                            Returns:      
                                            boolean
            
                                         | 
                            
| Private findMatchingRoute | 
                                        
                                    findMatchingRoute(request: HttpRequest
                                 | 
                            
| 
                                         
                                            Returns:      
                                            any
            
                                         | 
                            
import {
  HttpInterceptor,
  HttpRequest,
  HttpHandler,
  HttpEvent,
} from '@angular/common/http';
import { Observable, from, of, iif } from 'rxjs';
import { Injectable, Inject } from '@angular/core';
import {
  AuthConfig,
  AuthConfigService,
  HttpInterceptorRouteConfig,
  ApiRouteDefinition,
  isHttpInterceptorRouteConfig,
} from './auth.config';
import { first } from 'rxjs/operators';
import { CryptrClientService } from './auth.client';
/** Interceptor to decorate requests with Access token */
@Injectable()
export class AuthHttpInterceptor implements HttpInterceptor {
  constructor(
    /** Cryptr config to use */
    @Inject(AuthConfigService) private config: AuthConfig,
    /** Client that wil lbe initialized */
    @Inject(CryptrClientService) private cryptrClient: any
  ) { }
  /** @ignore */
  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    const aToken = this.cryptrClient.getCurrentAccessToken();
    let finalReq = req;
    if (this.config.httpInterceptor?.apiRequestsToSecure !== undefined && aToken !== undefined) {
      this.config.httpInterceptor.apiRequestsToSecure.forEach(route => {
        if (this.canAttachToken(route, req)) {
          finalReq = req.clone({
            headers: req.headers.set('Authorization', `Bearer ${aToken}`),
          });
        }
      });
    }
    return next.handle(finalReq);
  }
  /** @ignore */
  private stripQueryFrom(uri: string): string {
    if (uri.indexOf('?') > -1) {
      uri = uri.substr(0, uri.indexOf('?'));
    }
    if (uri.indexOf('#') > -1) {
      uri = uri.substr(0, uri.indexOf('#'));
    }
    return uri;
  }
  /** @ignore */
  private canAttachToken(
    route: ApiRouteDefinition,
    request: HttpRequest<any>
  ): boolean {
    const testPrimitive = (value: string) => {
      if (value) {
        value.trim();
      }
      if (!value) {
        return false;
      }
      const requestPath = this.stripQueryFrom(request.url);
      if (value === requestPath) {
        return true;
      }
      // If the URL ends with an asterisk, match using startsWith.
      if (
        value.indexOf('*') === value.length - 1 &&
        request.url.startsWith(value.substr(0, value.length - 1))
      ) {
        return true;
      }
    };
    if (isHttpInterceptorRouteConfig(route)) {
      if (route.httpMethod && route.httpMethod !== request.method) {
        return false;
      }
      return testPrimitive(route.uri);
    }
    return testPrimitive(route);
  }
  /** @ignore */
  private findMatchingRoute(
    request: HttpRequest<any>
  ): Observable<HttpInterceptorRouteConfig> {
    return from(this.config.httpInterceptor.apiRequestsToSecure).pipe(
      first((route) => this.canAttachToken(route, request), null)
    );
  }
}