问题描述
在我的 Angular 应用程序中,我以这种方式初始化加载 keycloak:
app.module.ts:
providers: [
{
provide: APP_INITIALIZER,useFactory: initializer,deps: [ KeycloakService,AppService ],multi: true
}
],
在 app-init.ts 中:
import { KeycloakService } from 'keycloak-angular';
import { AppService } from 'src/app/app.service';
import { environment } from '../environments/environment';
export function initializer(keycloak: KeycloakService,appService: AppService): () => Promise<any> {
return (): Promise<any> => {
return new Promise<void>(async (resolve,reject) => {
try {
await keycloak.init({
config: {
url: environment.keycloak.issuer,realm: environment.keycloak.realm,clientId: environment.keycloak.clientId
},loadUserProfileAtStartUp: true,initOptions: {
onLoad: 'check-sso',checkLoginIframe: true,pkceMethod: 'S256'
},bearerExcludedUrls: ['/']
}).then(async a => {
appService.setLoggedIn(a); // passing authorization status: true or false to appservice for later use
});
resolve();
} catch (error) {
reject(error);
}
})
};
}
Keycloak-js 有很多功能:(https://www.keycloak.org/docs/latest/securing_apps/)。 例如我如何使用这个方法:createlogoutUrl(options)。
当我尝试执行 keycloak.createlogoutUrl() 时,它说 keycloak(来自 keycloak-angular 的 KeycloakService)没有此功能。
如何从我的 keycloak 实例访问这个额外的功能?
解决方法
我找到了解决方案。 keycloka-angular 有方法 getKeycloakInstance()。,文档中没有提到它,但我找到了它的例子。
let keycloakInstance = keycloak.getKeycloakInstance();
现在,我的属性 keycloakInstance 可以访问所有 keycloak-js 属性和方法。