令牌拦截器和Auth Guard中注入服务的计时问题

时间:2019-05-14 15:07:44

标签: angular typescript rxjs

因此,我需要读取config.json文件来获取AWS上的auth服务的URL。因此,我创建了一个配置服务,该服务读取配置文件并将其作为提供程序添加到app.module中。在我尝试将配置服务注入到我的身份验证服务之前,它返回了一个promise,并且似乎很好用。在身份验证服务的构造函数中,它尝试使用config服务中的url,但目前未定义。由于身份验证服务使用oidc客户端,因此在身份验证服务构造函数中需要此URL。身份验证服务被注入到auth保护和令牌拦截器中。我认为这就是为什么config服务在其他地方都能正常工作的原因,但在这里却不行,因为它们比普通组件要早构建。

我一直在尝试我能想到的一切,但是似乎没有任何东西可以使我获得此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'
    };
  }

我只需要能够保持处理,直到加载配置文件并且这些值可用为止。

1 个答案:

答案 0 :(得分:0)

您可以使用可观察和订阅

  private _configStatus = new BehaviorSubject<boolean>(false);
  public configStatus$ = this._configStatus.asObservable();

一旦配置完全加载,

  this.config = JSON.parse(JSON.stringify(res));
  this._configStatus.next(true);

订阅令牌拦截器

   this.config.configStatus$.subscribe(value => {
      if(value) {console.log(`TokenInterceptor: config value ${config.getConfig()}}`);}
   });