Я пытаюсь запихнуть своего провайдера 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' из неопределенного