因此,我需要读取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'
};
}
我只需要能够保持处理,直到加载配置文件并且这些值可用为止。
答案 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()}}`);}
});