93 lines
4.0 KiB
TypeScript
93 lines
4.0 KiB
TypeScript
import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';
|
|
|
|
import { KeycloakAngularModule, KeycloakOptions, KeycloakService } from 'keycloak-angular';
|
|
import { DefaultUserService } from './services/default-user.service';
|
|
import { IIqserUser } from './types/user.response';
|
|
import { IqserUserService } from './services/iqser-user.service';
|
|
import { BASE_HREF, ModuleWithOptions } from '../utils';
|
|
import { IqserUsersModuleOptions } from './types/iqser-users-module-options';
|
|
import { IqserUser } from './iqser-user.model';
|
|
import { IqserRoleGuard } from './guards/iqser-role-guard.service';
|
|
import { IqserAuthGuard } from './guards/iqser-auth-guard.service';
|
|
import { IqserConfigService } from '../services';
|
|
import { NamePipe } from './name.pipe';
|
|
import { InitialsAvatarComponent } from './components/initials-avatar/initials-avatar.component';
|
|
import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip';
|
|
import { CommonModule } from '@angular/common';
|
|
import { UserButtonComponent } from './components/user-button/user-button.component';
|
|
import { MatIconModule } from '@angular/material/icon';
|
|
import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button';
|
|
|
|
function getKeycloakOptions(baseUrl: string, configService: IqserConfigService): KeycloakOptions {
|
|
let url: string = configService.values.OAUTH_URL;
|
|
url = url.replace(/\/$/, ''); // remove trailing slash
|
|
const realm = url.substring(url.lastIndexOf('/') + 1, url.length);
|
|
url = url.substring(0, url.lastIndexOf('/realms'));
|
|
return {
|
|
config: {
|
|
url: url,
|
|
realm: realm,
|
|
clientId: configService.values.OAUTH_CLIENT_ID,
|
|
},
|
|
initOptions: {
|
|
checkLoginIframe: false,
|
|
onLoad: 'check-sso',
|
|
silentCheckSsoRedirectUri: window.location.origin + baseUrl + '/assets/oauth/silent-refresh.html',
|
|
flow: 'standard',
|
|
},
|
|
enableBearerInterceptor: true,
|
|
};
|
|
}
|
|
|
|
function configureAutomaticRedirectToLoginScreen(keyCloakService: KeycloakService, configService: IqserConfigService) {
|
|
keyCloakService.getKeycloakInstance().onAuthRefreshError = () => {
|
|
window.location.href = keyCloakService.getKeycloakInstance().createLoginUrl({
|
|
redirectUri: window.location.href,
|
|
idpHint: configService.values.OAUTH_IDP_HINT,
|
|
});
|
|
};
|
|
}
|
|
|
|
export function keycloakInitializer(
|
|
keycloakService: KeycloakService,
|
|
configService: IqserConfigService,
|
|
baseUrl: string,
|
|
): () => Promise<void> {
|
|
const x = keycloakService.init(getKeycloakOptions(baseUrl, configService));
|
|
return () => x.then(() => configureAutomaticRedirectToLoginScreen(keycloakService, configService));
|
|
}
|
|
|
|
const components = [NamePipe, InitialsAvatarComponent, UserButtonComponent];
|
|
|
|
@NgModule({
|
|
imports: [KeycloakAngularModule, MatTooltipModule, CommonModule, MatIconModule, MatButtonModule],
|
|
declarations: [...components],
|
|
exports: [...components],
|
|
})
|
|
export class IqserUsersModule extends ModuleWithOptions {
|
|
static forRoot<
|
|
Interface extends IIqserUser,
|
|
Class extends IqserUser & Interface,
|
|
UserService extends IqserUserService<Interface, Class>,
|
|
RolesGuard extends IqserRoleGuard = IqserRoleGuard,
|
|
>(options: IqserUsersModuleOptions<Interface, Class, UserService, RolesGuard>): ModuleWithProviders<IqserUsersModule> {
|
|
const userService = this._getService(IqserUserService, DefaultUserService, options.existingUserService);
|
|
const roleGuard = this._getService(IqserRoleGuard, IqserRoleGuard, options.existingRoleGuard);
|
|
|
|
return {
|
|
ngModule: IqserUsersModule,
|
|
providers: [
|
|
userService,
|
|
roleGuard,
|
|
IqserAuthGuard,
|
|
{
|
|
provide: APP_INITIALIZER,
|
|
useFactory: keycloakInitializer,
|
|
multi: true,
|
|
deps: [KeycloakService, IqserConfigService, BASE_HREF],
|
|
},
|
|
],
|
|
};
|
|
}
|
|
}
|