140 lines
4.5 KiB
TypeScript
140 lines
4.5 KiB
TypeScript
import type { RequestArgs } from "./resources/agent.js";
|
|
import { AttackDetection } from "./resources/attackDetection.js";
|
|
import { AuthenticationManagement } from "./resources/authenticationManagement.js";
|
|
import { Cache } from "./resources/cache.js";
|
|
import { ClientPolicies } from "./resources/clientPolicies.js";
|
|
import { Clients } from "./resources/clients.js";
|
|
import { ClientScopes } from "./resources/clientScopes.js";
|
|
import { Components } from "./resources/components.js";
|
|
import { Groups } from "./resources/groups.js";
|
|
import { IdentityProviders } from "./resources/identityProviders.js";
|
|
import { Realms } from "./resources/realms.js";
|
|
import { Roles } from "./resources/roles.js";
|
|
import { ServerInfo } from "./resources/serverInfo.js";
|
|
import { Users } from "./resources/users.js";
|
|
import { UserStorageProvider } from "./resources/userStorageProvider.js";
|
|
import { WhoAmI } from "./resources/whoAmI.js";
|
|
import { Credentials, getToken } from "./utils/auth.js";
|
|
import { defaultBaseUrl, defaultRealm } from "./utils/constants.js";
|
|
|
|
export interface TokenProvider {
|
|
getAccessToken: () => Promise<string | undefined>;
|
|
}
|
|
|
|
export interface ConnectionConfig {
|
|
baseUrl?: string;
|
|
realmName?: string;
|
|
requestOptions?: RequestInit;
|
|
requestArgOptions?: Pick<RequestArgs, "catchNotFound">;
|
|
}
|
|
|
|
export class KeycloakAdminClient {
|
|
// Resources
|
|
public users: Users;
|
|
public userStorageProvider: UserStorageProvider;
|
|
public groups: Groups;
|
|
public roles: Roles;
|
|
public clients: Clients;
|
|
public realms: Realms;
|
|
public clientScopes: ClientScopes;
|
|
public clientPolicies: ClientPolicies;
|
|
public identityProviders: IdentityProviders;
|
|
public components: Components;
|
|
public serverInfo: ServerInfo;
|
|
public whoAmI: WhoAmI;
|
|
public attackDetection: AttackDetection;
|
|
public authenticationManagement: AuthenticationManagement;
|
|
public cache: Cache;
|
|
|
|
// Members
|
|
public baseUrl: string;
|
|
public realmName: string;
|
|
public accessToken?: string;
|
|
public refreshToken?: string;
|
|
|
|
private requestOptions?: RequestInit;
|
|
private globalRequestArgOptions?: Pick<RequestArgs, "catchNotFound">;
|
|
private tokenProvider?: TokenProvider;
|
|
|
|
constructor(connectionConfig?: ConnectionConfig) {
|
|
this.baseUrl = connectionConfig?.baseUrl || defaultBaseUrl;
|
|
this.realmName = connectionConfig?.realmName || defaultRealm;
|
|
this.requestOptions = connectionConfig?.requestOptions;
|
|
this.globalRequestArgOptions = connectionConfig?.requestArgOptions;
|
|
|
|
// Initialize resources
|
|
this.users = new Users(this);
|
|
this.userStorageProvider = new UserStorageProvider(this);
|
|
this.groups = new Groups(this);
|
|
this.roles = new Roles(this);
|
|
this.clients = new Clients(this);
|
|
this.realms = new Realms(this);
|
|
this.clientScopes = new ClientScopes(this);
|
|
this.clientPolicies = new ClientPolicies(this);
|
|
this.identityProviders = new IdentityProviders(this);
|
|
this.components = new Components(this);
|
|
this.authenticationManagement = new AuthenticationManagement(this);
|
|
this.serverInfo = new ServerInfo(this);
|
|
this.whoAmI = new WhoAmI(this);
|
|
this.attackDetection = new AttackDetection(this);
|
|
this.cache = new Cache(this);
|
|
}
|
|
|
|
public async auth(credentials: Credentials) {
|
|
const { accessToken, refreshToken } = await getToken({
|
|
baseUrl: this.baseUrl,
|
|
realmName: this.realmName,
|
|
credentials,
|
|
requestOptions: this.requestOptions,
|
|
});
|
|
this.accessToken = accessToken;
|
|
this.refreshToken = refreshToken;
|
|
}
|
|
|
|
public registerTokenProvider(provider: TokenProvider) {
|
|
if (this.tokenProvider) {
|
|
throw new Error("An existing token provider was already registered.");
|
|
}
|
|
|
|
this.tokenProvider = provider;
|
|
}
|
|
|
|
public setAccessToken(token: string) {
|
|
this.accessToken = token;
|
|
}
|
|
|
|
public async getAccessToken() {
|
|
if (this.tokenProvider) {
|
|
return this.tokenProvider.getAccessToken();
|
|
}
|
|
|
|
return this.accessToken;
|
|
}
|
|
|
|
public getRequestOptions() {
|
|
return this.requestOptions;
|
|
}
|
|
|
|
public getGlobalRequestArgOptions():
|
|
| Pick<RequestArgs, "catchNotFound">
|
|
| undefined {
|
|
return this.globalRequestArgOptions;
|
|
}
|
|
|
|
public setConfig(connectionConfig: ConnectionConfig) {
|
|
if (
|
|
typeof connectionConfig.baseUrl === "string" &&
|
|
connectionConfig.baseUrl
|
|
) {
|
|
this.baseUrl = connectionConfig.baseUrl;
|
|
}
|
|
|
|
if (
|
|
typeof connectionConfig.realmName === "string" &&
|
|
connectionConfig.realmName
|
|
) {
|
|
this.realmName = connectionConfig.realmName;
|
|
}
|
|
this.requestOptions = connectionConfig.requestOptions;
|
|
}
|
|
}
|