Проблема синхронизации с введенным сервисом в токене-перехватчике и аутентификации - PullRequest
0 голосов
/ 14 мая 2019

Поэтому мне нужно прочитать файл config.json, чтобы получить URL-адреса для службы аутентификации, которая находится в AWS.Поэтому я создал службу конфигурации, которая читает файл конфигурации, и добавил его в качестве поставщика в app.module.Он возвращает обещание и, кажется, прекрасно работает, пока я не попытался внедрить этот сервис конфигурации в мою службу аутентификации.В конструкторе службы аутентификации он пытается использовать URL-адрес из службы конфигурации, но на этом этапе он не определен.Поскольку служба аутентификации использует клиент oidc, мне нужен этот URL в конструкторе службы аутентификации.Служба аутентификации вводится в аутентификацию и в токен-перехватчик.Я думаю, именно поэтому служба конфигурации работает хорошо везде, но не здесь, поскольку они создаются раньше, чем обычный компонент.

Я пробовал все, что мог придумать, но, похоже, ничто не дает мне этот URLЯ действительно надеюсь, что есть более умный разработчик, который может помочь мне.

Вот StackBlitz для демонстрации проблемы.Это небольшая демонстрация, но я думаю, что если кто-то сможет это решить, то это решит мою проблему.

https://stackblitz.com/edit/read-local-json-file-inside-interceptor

Я попытался добавить метод, чтобы проверить, была ли загружена конфигурация, и попытался задержать обработку в конструкторе службы аутентификации.Я попытался изменить обещание на наблюдаемое.Я попытался прочитать файл конфигурации непосредственно в конструкторе службы аутентификации, черт возьми, я пробовал дюжину вещей, но это те, которые я помню, так как я работал над этим уже 3 дня.

Метод вapp.module, который вызывает метод loadConfig в моей службе конфигурации.

  return () => configService.loadConfig();
}

Как вы можете видеть, он установлен в качестве поставщика

 providers: [
    ConfigService,
    {
      provide: APP_INITIALIZER,
      useFactory: initConfig,
      deps: [
        ConfigService
      ],
      multi: true
    },

Мой вызов службы конфигурации для загрузки файла,Опять же, это прекрасно работало, пока я не ввел сервис аутентификации.

 public loadConfig(): Promise<any> {
    const promise = new Promise((resolve, reject) => {
      this.http.get('config.json')
        .toPromise()
        .then(
          res => { // Success
            this.config = JSON.parse(JSON.stringify(res));
            resolve();
          }
        );
    });
    return promise;
  }

Вот служба авторизации

constructor(@Inject(AuthenticationConfigService)
  private config: AuthenticationConfig,
    private router: Router,
    private configService: ConfigService,
    private http: HttpClient
  ) {
    const clientSettings = this.getClientSettings(config);
    this.manager = new UserManager(clientSettings);

    this.manager.getUser().then(user => {
      this.user = user;
    });

    this.redirectUrlKey = `redirectUrl:${this.manager.settings.authority}:${this.manager.settings.client_id}`;

    this.hookUpEvents();
  }

 private getClientSettings(config: AuthenticationConfig): UserManagerSettings {
    const url = window.location.origin;

    return {
      authority: this.configService.getAPIRoute('auth'), //this line fails
      // authority: config.authServer, //this line works as it has the url already defined
      client_id: config.clientId,
      redirect_uri: url + '/auth-callback',
      post_logout_redirect_uri: url,
      response_type: 'code',
      scope: config.scope,
      filterProtocolClaims: true,
      loadUserInfo: true,
      silent_redirect_uri: url + '/auth-silent'
    };
  }

Мне просто нужно иметь возможность задерживать обработку до тех пор, пока файл конфигурации не загрузится и эти значения не станут доступны.

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