Угловой провайдер Keycloak от node_module - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь запихнуть своего провайдера keycloak в модуль npm, который может быть повторно использован в наборе приложений, все отлично работает, когда модуль находится в базовом приложении, но прерывается с ошибкой в ​​бутылках при вызове из node_module

код для перехватчика:

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable, from } from 'rxjs';
import { KeycloakService } from 'keycloak-angular';
import { switchMap } from 'rxjs/operators';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor(private keycloakService: KeycloakService) {}


  getToken() {
    return from(this.keycloakService.getToken());
  }


  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<any> {
    return this.addAuthorizationHeader(req, next)
  }

  addAuthorizationHeader(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    return this.getToken().pipe(
      switchMap(token => {
        request = request.clone({
          setHeaders: {
            Authorization: 'bearer ' + token
          }
        });
        return next.handle(request);
      })
    );
  }
}

код для провайдера:

export function initializer(config) {
  const keycloak = new KeycloakService();     

  return (): Promise<any> => {
    return new Promise(async (resolve, reject) => {
      try {
        await keycloak.init({
          config,
          initOptions,
          bearerExcludedUrls: []
        });

        resolve();
      } catch (error) {
        reject(error);
      }
    });
  };
}

export const KeycloakProvider: FactoryProvider = {
  provide: APP_INITIALIZER,
  useFactory: initializer,
  multi: true,
  deps: [KeycloakService]
};

app.module для AuthModule

import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { NgModule, ModuleWithProviders, APP_INITIALIZER } from '@angular/core';
import { KeycloakAngularModule, KeycloakService } from 'keycloak-angular';
import { AuthInterceptor } from './auth-interceptor';
import { initializer } from './auth-provider';

@NgModule({
  imports: [
    HttpClientModule,
    KeycloakAngularModule,
  ],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: AuthInterceptor,
      multi: true
    }
  ]
})
export class AuthModule {
  static forRoot(config): ModuleWithProviders {
    return {
      ngModule: AuthModule,
      providers: [
        {
          provide: APP_INITIALIZER,
          useFactory: initializer(config),
          multi: true,
          deps: [KeycloakService]
        }
      ]
    };
  }
}

app.module для основногоapp ... import {AuthModule} из 'common-utils / dist / common-auth';

...
  imports: [
    AuthModule.forRoot({
      configOptions: ...,
      initOptions: {
        onLoad: 'login-required',
        checkLoginIframe: false
      }
    }),
    BrowserModule,
    HttpClientModule,
    KeycloakAngularModule,
    AppRoutingModule,
    BrowserAnimationsModule
  },
  bootstrap: [AppComponent]
})
export class AppModule {}

, как уже упоминалось, эта настройка прекрасно работает, если поставщик находится в папке приложения, но не при входе измодуль_узлаНе уверен, в чем проблема, так как ошибка в модуле скрыта и не возникает в версии приложения

Сообщение об ошибке:

Ошибка: Uncaught (в обещании): ошибка произошла во времяпроверка доступа. Подробности: TypeError: Невозможно прочитать свойство 'resourceAccess' из неопределенного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...