import * as i0 from '@angular/core'; import { InjectionToken, Type, ModuleWithProviders, EnvironmentProviders } from '@angular/core'; import Keycloak from 'keycloak-js'; import { HttpInterceptorFn } from '@angular/common/http'; interface SdKeycloakTenantConfig { url: string; realm: string; clientId: string; secureRoutes?: string[]; /** * Basename (KHÔNG kèm đuôi `.html`) của file Keycloak **silent SSO redirect** mà consumer * BẮT BUỘC đặt trong thư mục `public/`. Mặc định `'silent-renew'`. * * Service sẽ truyền `${origin}/.html` vào `silentCheckSsoRedirectUri`. Với giá trị * mặc định, Keycloak gọi `${origin}/silent-renew.html` (giống hành vi cũ — không phá vỡ project hiện có). * * Consumer cần tạo file tĩnh này (nội dung mẫu ở `modules/keycloak/htmls/silent-renew.html`); nếu THIẾU, * silent `check-sso` thất bại và `init()` trả về `false` không mong muốn (user bị coi là chưa đăng nhập). * Cho phép truyền kèm `/` đầu hoặc đuôi `.html` (tự chuẩn hoá), hoặc đặt sâu hơn: * `'assets/silent-renew'` → `${origin}/assets/silent-renew.html`. */ silentRenewUrl?: string; /** * Basename (KHÔNG kèm đuôi `.html`) của **trang lỗi tĩnh** trong `public/`, dùng làm đích redirect khi * `keycloak.init()` NÉM LỖI (Keycloak sập / mạng lỗi / cấu hình realm sai). Mặc định `'auth-keycloak-error'`. * * Khi init thất bại, app điều hướng full-page tới `${origin}/.html`. Vì là file tĩnh nên * trang lỗi vẫn hiển thị kể cả khi bundle Angular chưa khởi tạo được. Service cũng tự bỏ qua `init()` nếu * đang đứng sẵn ở trang lỗi này (chống vòng lặp redirect). * * Consumer nên tạo file (nội dung mẫu ở `modules/keycloak/htmls/auth-keycloak-error.html`) và viết lại * branding/nội dung. Nếu THIẾU, redirect rơi vào trang 404 của host. Chuẩn hoá giá trị giống `silentRenewUrl`. */ authErrorUrl?: string; } interface ISdKeycloakConfiguration { loadTenantConfig: () => Promise; } declare const SD_KEYCLOAK_CONFIGURATION: InjectionToken; declare class SdKeycloakService { keycloak: Keycloak; config: SdKeycloakTenantConfig; init(config: SdKeycloakTenantConfig): Promise; /** * Chuẩn hoá basename file tĩnh trong public/ thành URL tuyệt đối. * `'silent-renew'` | `'/silent-renew'` | `'silent-renew.html'` → `${origin}/silent-renew.html`. */ private toPublicHtmlUrl; login(): Promise; logout(): Promise; getToken(): string | undefined; getIsAuthenticated(): boolean; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵprov: i0.ɵɵInjectableDeclaration; } declare const SdKeycloakInterceptor: HttpInterceptorFn; declare function provideSdKeycloak(options: { useClass?: Type; useFactory?: (...args: any[]) => ISdKeycloakConfiguration; deps?: any[]; }): EnvironmentProviders; declare class SdKeycloakModule { static forRoot(options: { useClass?: Type; useFactory?: (...args: any[]) => ISdKeycloakConfiguration; deps?: any[]; }): ModuleWithProviders; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵmod: i0.ɵɵNgModuleDeclaration; static ɵinj: i0.ɵɵInjectorDeclaration; } export { SD_KEYCLOAK_CONFIGURATION, SdKeycloakInterceptor, SdKeycloakModule, SdKeycloakService, provideSdKeycloak }; export type { ISdKeycloakConfiguration, SdKeycloakTenantConfig };