MSAL Angular - NullInjectorError: Нет поставщика для InjectionToken MSAL_CONFIG - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь динамически загрузить файл конфигурации MSAL, но я получил ошибку:

NullInjectorError: Нет поставщика для InjectionToken MSAL_CONFIG!

Вот код :

import { NgModule, Optional, SkipSelf, APP_INITIALIZER } from "@angular/core";
import { CommonModule } from "@angular/common";
import { HttpClientModule, HTTP_INTERCEPTORS } from "@angular/common/http";
import { MsalModule, MsalInterceptor, MsalConfig, MsalService } from "@azure/msal-angular";
import { ConfigService } from "./config/config.service";
import { MSAL_CONFIG } from "@azure/msal-angular/dist/msal.service";

export function initConfiguration(configService: ConfigService) {
    // This will load the json file and store it in a variable
    return () => configService.init();
}

export function msalConfigFactory(configService: ConfigService): MsalConfig {
    // get the config from the service
    return configService.get();
}

@NgModule({
    imports: [CommonModule, HttpClientModule, MsalModule],
    declarations: [],
    providers: [
        ConfigService,
        {
            provide: APP_INITIALIZER,
            useFactory: initConfiguration,
            deps: [ConfigService],
            multi: true
        },
        {
            provide: MSAL_CONFIG,
            useFactory: msalConfigFactory,
            deps: [ConfigService]
        },
        MsalService,
        {
            provide: HTTP_INTERCEPTORS,
            useClass: MsalInterceptor,
            multi: true
        }
    ]
})
export class CoreModule {
    constructor(
        @Optional()
        @SkipSelf()
        parentModule: CoreModule
    ) {
        if (parentModule) {
            throw new Error("CoreModule is already loaded. Import only in AppModule");
        }
    }
}

Поскольку я предоставляю объект MSAL_CONFIG, я не понимаю, почему он выдает эту ошибку.

Я попытался переместить все в app.module, но получил та же ошибка. Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Попробуйте указать пользовательский класс или фабрику, которые предоставляют MSAL_CONFIG:

providers: [
...
{
  provide: MSAL_CONFIG,
  useFactory: MSALConfigFactory
},
...
]

Мой поставщик конфигурации MSAL возвращает 'Configuration' из 'msal':

import { Configuration } from 'msal';

export function MSALConfigFactory(): Configuration {
 return {
  auth: {
   clientId: 'id',
   authority: 'something',
   redirectUri: 'uri',
   postLogoutRedirectUri: 'uri',
  },
  cache: {
   cacheLocation: 'localStorage'
  },
 }
};
0 голосов
/ 19 февраля 2020
import { MsalModule } from "@azure/msal-angular";
import { MsalService, MsalConfig } from "@azure/msal-angular";
import { MSAL_CONFIG } from "@azure/msal-angular/dist/msal.service";
import { MsalInterceptor } from "@azure/msal-angular/dist/msal.interceptor";

export function getConfig() {
  var request = new XMLHttpRequest();
  request.open('GET', "/api/settings", false);  // request application settings synchronous
  request.send(null);
  const response = JSON.parse(request.responseText);
  return response as MsalConfig;
}

@NgModule({
 imports: [
MsalModule
],
 providers: [
    MsalService,
    {
      provide: MSAL_CONFIG,
      useValue: getConfig()
    },
    { 
      provide: HTTP_INTERCEPTORS, 
      useClass: MsalInterceptor, 
      multi: true 
    },
] , 
bootstrap: [AppComponent]
})

попробуйте, если вы не нашли решение =)

...