From ed1ab86e69b02f2ba8c1f1ef418b26adae16b621 Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Thu, 13 Apr 2023 13:26:02 +0200 Subject: [PATCH] core --- apps/login/lib/zitadel.ts | 15 +++++++++ apps/login/ui/IdentityProviders.tsx | 2 +- packages/zitadel-core/package.json | 3 +- packages/zitadel-core/src/admin.ts | 7 ++-- packages/zitadel-core/src/app.ts | 45 +++++++++++++++++++++++++ packages/zitadel-core/src/auth.ts | 9 +++-- packages/zitadel-core/src/core.ts | 21 ------------ packages/zitadel-core/src/index.ts | 9 ++++- packages/zitadel-core/src/management.ts | 33 ++++++++++++------ packages/zitadel-core/src/system.ts | 12 +++---- packages/zitadel-core/tsconfig.json | 2 +- pnpm-lock.yaml | 2 ++ 12 files changed, 111 insertions(+), 49 deletions(-) create mode 100644 apps/login/lib/zitadel.ts create mode 100644 packages/zitadel-core/src/app.ts delete mode 100644 packages/zitadel-core/src/core.ts diff --git a/apps/login/lib/zitadel.ts b/apps/login/lib/zitadel.ts new file mode 100644 index 00000000000..4bccc5d3036 --- /dev/null +++ b/apps/login/lib/zitadel.ts @@ -0,0 +1,15 @@ +import { ZitadelOptions, getApps, initializeApp } from "@zitadel/core"; + +export const zitadelConfig: ZitadelOptions = { + apiUrl: process.env.ZITADEL_API_URL ?? "", + projectId: process.env.ZITADEL_PROJECT_ID ?? "", + appId: process.env.ZITADEL_APP_ID ?? "", + token: "this should be a pat", +}; + +if (!getApps().length) { + initializeApp(zitadelConfig); +} + +const app = getApp(); +// const auth = getAuth(); diff --git a/apps/login/ui/IdentityProviders.tsx b/apps/login/ui/IdentityProviders.tsx index 13df9f0306f..9fcd2f27b0b 100644 --- a/apps/login/ui/IdentityProviders.tsx +++ b/apps/login/ui/IdentityProviders.tsx @@ -1,4 +1,4 @@ -import { SignInWithGoogle } from "#/../../packages/zitadel-react/dist"; +import { SignInWithGoogle } from "@zitadel/react"; export default function IdentityProviders() { return ( diff --git a/packages/zitadel-core/package.json b/packages/zitadel-core/package.json index 5f896ca8238..fd4c2e1844d 100644 --- a/packages/zitadel-core/package.json +++ b/packages/zitadel-core/package.json @@ -28,7 +28,8 @@ "access": "public" }, "dependencies": { + "jose": "^4.13.1", "nice-grpc": "2.0.1", - "jose": "^4.13.1" + "protobufjs": "^7.2.3" } } diff --git a/packages/zitadel-core/src/admin.ts b/packages/zitadel-core/src/admin.ts index 52b5640494d..626a2b64545 100644 --- a/packages/zitadel-core/src/admin.ts +++ b/packages/zitadel-core/src/admin.ts @@ -15,17 +15,14 @@ const createClient = ( definition: CompatServiceDefinition, accessToken: string ) => { - const channel = createChannel(process.env.ZITADEL_API_URL); + const channel = createChannel(process.env.ZITADEL_API_URL ?? ""); return createClientFactory() .use(authMiddleware(accessToken)) .create(definition, channel) as Client; }; -export const getAuth = async () => - createClient(AuthServiceDefinition, ""); - export const getAdmin = () => createClient( - AdminServiceDefinition, + AdminServiceDefinition as CompatServiceDefinition, process.env.ZITADEL_ADMIN_TOKEN ?? "" ); diff --git a/packages/zitadel-core/src/app.ts b/packages/zitadel-core/src/app.ts new file mode 100644 index 00000000000..360518aab39 --- /dev/null +++ b/packages/zitadel-core/src/app.ts @@ -0,0 +1,45 @@ +/** + * Return a slugified copy of a string. + * + * @param {CoreProps} str The ZITADEL client configuration + * @return {Core} The client implementation. + */ + +let apps: ZitadelApp[] = []; + +export interface ZitadelCoreProps { + clientId: string; + apiUrl: string; // process.env.ZITADEL_API_URL + token: string; + adminToken?: string; + managementToken?: string; +} + +export interface ZitadelOptions extends ZitadelCoreProps { + name?: string; +} + +export interface ZitadelApp { + name: string | undefined; + config: ZitadelCoreProps; +} + +export async function initializeApp( + config: ZitadelCoreProps, + name?: string +): Promise { + const app = { config, name }; + return app; +} + +export function getApps(): ZitadelApp[] { + return apps; +} + +export function getApp(name?: string): ZitadelApp | undefined { + return name + ? apps.find((a) => a.name === name) + : apps.length === 1 + ? apps[0] + : undefined; +} diff --git a/packages/zitadel-core/src/auth.ts b/packages/zitadel-core/src/auth.ts index d059a5d9fd0..bab2f1cc974 100644 --- a/packages/zitadel-core/src/auth.ts +++ b/packages/zitadel-core/src/auth.ts @@ -4,19 +4,22 @@ import { AuthServiceClient, AuthServiceDefinition, } from "./proto/server/zitadel/auth"; -import { ZitadelApp } from "./core"; +import { ZitadelApp } from "./app"; import { authMiddleware } from "./middleware"; const createClient = ( definition: CompatServiceDefinition, accessToken: string ) => { - const channel = createChannel(process.env.ZITADEL_API_URL); + const channel = createChannel(process.env.ZITADEL_API_URL ?? ""); return createClientFactory() .use(authMiddleware(accessToken)) .create(definition, channel) as Client; }; export async function getAuth(app?: ZitadelApp): Promise { - return createClient(AuthServiceDefinition, ""); + return createClient( + AuthServiceDefinition as CompatServiceDefinition, + "" + ); } diff --git a/packages/zitadel-core/src/core.ts b/packages/zitadel-core/src/core.ts deleted file mode 100644 index 0b19d15be20..00000000000 --- a/packages/zitadel-core/src/core.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Return a slugified copy of a string. - * - * @param {CoreProps} str The ZITADEL client configuration - * @return {Core} The client implementation. - */ - -export interface ZitadelCoreProps { - clientId: string; -} - -export interface ZitadelApp { - config: ZitadelCoreProps; -} - -export async function initializeApp( - config: ZitadelCoreProps -): Promise { - const app = { config }; - return app; -} diff --git a/packages/zitadel-core/src/index.ts b/packages/zitadel-core/src/index.ts index 8fe7bb39276..2d50c862b8b 100644 --- a/packages/zitadel-core/src/index.ts +++ b/packages/zitadel-core/src/index.ts @@ -1 +1,8 @@ -export { initializeApp } from "./core"; +export { initializeApp, getApps } from "./app"; + +export { getAuth } from "./auth"; +export { getManagement } from "./management"; +export { getAdmin } from "./admin"; +export { getSystem } from "./system"; + +export type { ZitadelOptions } from "./app"; diff --git a/packages/zitadel-core/src/management.ts b/packages/zitadel-core/src/management.ts index d6c3a202c1c..0d67c1224ca 100644 --- a/packages/zitadel-core/src/management.ts +++ b/packages/zitadel-core/src/management.ts @@ -7,26 +7,39 @@ import { } from "./proto/server/zitadel/management"; import { authMiddleware } from "./middleware"; -import { ZitadelApp } from "./core"; +import { ZitadelApp, getApps } from "./app"; const createClient = ( definition: CompatServiceDefinition, - accessToken: string + apiUrl: string, + token: string ) => { - const apiUrl = process.env.ZITADEL_API_URL; - if (!apiUrl) { throw Error("ZITADEL_API_URL not set"); } - const channel = createChannel(process.env.ZITADEL_API_URL); + const channel = createChannel(process.env.ZITADEL_API_URL ?? ""); return createClientFactory() - .use(authMiddleware(accessToken)) + .use(authMiddleware(token)) .create(definition, channel) as Client; }; -export const getManagement = (app?: ZitadelApp) => - createClient( - ManagementServiceDefinition, - process.env.ZITADEL_ADMIN_TOKEN ?? "" +export const getManagement = (app?: string | ZitadelApp) => { + let config; + if (app && typeof app === "string") { + const apps = getApps(); + config = apps.find((a) => a.name === app)?.config; + } else if (app && typeof app === "object") { + config = app.config; + } + + if (!config) { + throw Error("No ZITADEL app found"); + } + + return createClient( + ManagementServiceDefinition as CompatServiceDefinition, + config.apiUrl, + config.token ); +}; diff --git a/packages/zitadel-core/src/system.ts b/packages/zitadel-core/src/system.ts index 529271dcfb4..1a6ab7c58ff 100644 --- a/packages/zitadel-core/src/system.ts +++ b/packages/zitadel-core/src/system.ts @@ -12,7 +12,7 @@ const createSystemClient = ( definition: CompatServiceDefinition, accessToken: string ) => { - const channel = createChannel(process.env.ZITADEL_SYSTEM_API_URL); + const channel = createChannel(process.env.ZITADEL_SYSTEM_API_URL ?? ""); return createClientFactory() .use(authMiddleware(accessToken)) .create(definition, channel) as Client; @@ -23,13 +23,13 @@ export const getSystem = async () => { .setProtectedHeader({ alg: "RS256" }) .setIssuedAt() .setExpirationTime("1h") - .setIssuer(process.env.ZITADEL_SYSTEM_API_USERID) - .setSubject(process.env.ZITADEL_SYSTEM_API_USERID) - .setAudience(process.env.ZITADEL_ISSUER) - .sign(await importPKCS8(process.env.ZITADEL_SYSTEM_API_KEY, "RS256")); + .setIssuer(process.env.ZITADEL_SYSTEM_API_USERID ?? "") + .setSubject(process.env.ZITADEL_SYSTEM_API_USERID ?? "") + .setAudience(process.env.ZITADEL_ISSUER ?? "") + .sign(await importPKCS8(process.env.ZITADEL_SYSTEM_API_KEY ?? "", "RS256")); return createSystemClient( - SystemServiceDefinition, + SystemServiceDefinition as CompatServiceDefinition, token ); }; diff --git a/packages/zitadel-core/tsconfig.json b/packages/zitadel-core/tsconfig.json index dc0bafe6d2b..e502a91e183 100644 --- a/packages/zitadel-core/tsconfig.json +++ b/packages/zitadel-core/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@zitadel/tsconfig/react-library.json", + "extends": "@zitadel/tsconfig/node14.json", "include": ["."], "compilerOptions": { "baseUrl": "." diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a58026c7a12..4970e354036 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,12 +110,14 @@ importers: eslint-config-zitadel: workspace:* jose: ^4.13.1 nice-grpc: 2.0.1 + protobufjs: ^7.2.3 ts-proto: ^1.139.0 tsup: ^5.10.1 typescript: ^4.5.3 dependencies: jose: 4.13.1 nice-grpc: 2.0.1 + protobufjs: 7.2.3 devDependencies: '@zitadel/tsconfig': link:../zitadel-tsconfig eslint: 7.32.0