Búsqueda de sitios web

angular - No se puede inyectar el servicio en los interceptores http


¿Cómo necesito configurar este HttpInterceptor? oidcSecurityService no está definido.

El HttpClient te permite escribir interceptores. Un caso de uso común sería interceptar cualquier solicitud HTTP saliente y agregar un encabezado de autorización. Ten en cuenta que inyectar OidcSecurityService en el interceptor a través del constructor resulta en una dependencia cíclica. Para evitar esto, usa el inyector en su lugar.

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
    private oidcSecurityService: OidcSecurityService;

    constructor(private injector: Injector) {}

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        let requestToForward = req;

        if (this.oidcSecurityService === undefined) {
            this.oidcSecurityService = this.injector.get(OidcSecurityService);
        }
        if (this.oidcSecurityService !== undefined) {
            let token = this.oidcSecurityService.getToken();
            if (token !== '') {
                let tokenValue = 'Bearer ' + token;
                requestToForward = req.clone({ setHeaders: { Authorization: tokenValue } });
            }
        } else {
            console.debug('OidcSecurityService undefined: NO auth header!');
        }

        return next.handle(requestToForward);
    }
}

Esto está en mi app.module. Necesito que se inyecte el OidcSecurityService.

  providers: [
    OidcSecurityService,
    OidcConfigService,
    {
      provide: APP_INITIALIZER,
      useFactory: loadConfig,
      deps: [OidcConfigService],
      multi: true
    },   
    AuthorizationGuard,
    {
      provide: HTTP_INTERCEPTORS, 
      useClass: AuthInterceptor, 
      multi: true
    }    
  ]

Respuesta #1

Prueba esto

@Injectable()
            export class AuthInterceptor implements HttpInterceptor {
                private oidcSecurityService: OidcSecurityService;

                constructor(private injector: Injector) { }

                intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
                    let requestToForward = req;
                    this.oidcSecurityService = this.injector.get(OidcSecurityService);
                    let token = this.oidcSecurityService.getToken();
                    if (token !== '') {
                        let tokenValue = 'Bearer ' + token;
                        requestToForward = req.clone({ setHeaders: { Authorization: tokenValue } });
                    }


                    return next.handle(requestToForward);
                }
            }
        }

Respuesta #2

Puedes inyectar el servicio directamente en el constructor:

   constructor(private oidcSecurityService : OidcSecurityService) { }

Había un error relacionado con la inyección de un servicio en un constructor, pero esto se solucionó en:

Angular 5.2.3 lanzado el 31 de enero de 2018

Por favor revisa esta respuesta: https://stackoverflow.com/a/48903734/3018671