我不完全了解如何将 OAuth2 访问令牌从 Promise (oidc-client-js) 提供给使用 Swagger-CodeGen 生成的 API 代码。
提供常量值很容易,但是如何在下面进行更改以从 oidc-client-js 获取用户的访问令牌?我想知道“正确”的方式。将这个标记粘贴在全局变量中的某个位置会很容易。
@NgModule({
imports: [
CommonModule,
ApiModule.forConfig(() => new Configuration({
accessToken: 'my-access-token' //this can also be a () => string function
}))
],
在使用 OnInit 的普通组件中,我可以从 oidc-client 的 UserManager 实例中获取承诺中的令牌。让这两个部分结合在一起让我感到困惑。一个看起来像静态配置,另一个需要订阅单例的承诺。
this.userSubscription = this.authService.getUser().subscribe((user) => {
if (user) {
this.access_token = user.access_token;
}
});
对我做错的事情的任何更正也将不胜感激。这是我第一个使用 Angular 的原型。
更新
在应用 Ben 的建议并花时间了解 APP_INITIALIZER(标记为实验性且 imo 记录非常稀少)之后,感觉有点矫枉过正。我以 Configuration 类的以下自定义提供程序结束,该提供程序被注入到使用 Swagger-CodeGen 生成的 TypeScript-Angular2 服务代码中:
providers: [
AuthService,
AuthGuardService,
{
provide: Configuration,
useFactory: (authSvc: AuthService) => new Configuration({accessToken: authSvc.getAccessToken.bind(authSvc)}),
deps: [AuthService],
multi: false
}
]
我更改了我的 AuthService 以将用户的最新 access_token 存储在服务上。该getAccessToken()
方法从 Swagger-CodeGen 生成的代码中调用,并返回最新的 jwt 以用于 HTTP 标头。感觉很干净,而且很有效。如果(以及为什么)这是解决我的问题的错误方法,请告诉我。