diff --git a/apps/login/locales/ar.json b/apps/login/locales/ar.json index efbb0601a..90a98bcc5 100644 --- a/apps/login/locales/ar.json +++ b/apps/login/locales/ar.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "تسجيل الدخول باستخدام AzureAD", "signInWithGithub": "تسجيل الدخول باستخدام GitHub", "signInWithGitlab": "تسجيل الدخول باستخدام GitLab", + "signInWithZitadel": "تسجيل الدخول باستخدام Zitadel", "loginError": { "title": "فشل تسجيل الدخول", "description": "حدث خطأ أثناء محاولة تسجيل الدخول." diff --git a/apps/login/locales/de.json b/apps/login/locales/de.json index c70aab118..88f02d69e 100644 --- a/apps/login/locales/de.json +++ b/apps/login/locales/de.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Mit AzureAD anmelden", "signInWithGithub": "Mit GitHub anmelden", "signInWithGitlab": "Mit GitLab anmelden", + "signInWithZitadel": "Mit Zitadel anmelden", "loginError": { "title": "Anmeldung fehlgeschlagen", "description": "Beim Anmelden ist ein Fehler aufgetreten." diff --git a/apps/login/locales/en.json b/apps/login/locales/en.json index 16bd5be53..5bd13795c 100644 --- a/apps/login/locales/en.json +++ b/apps/login/locales/en.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Sign in with AzureAD", "signInWithGithub": "Sign in with GitHub", "signInWithGitlab": "Sign in with GitLab", + "signInWithZitadel": "Sign in with Zitadel", "loginError": { "title": "Login failed", "description": "An error occurred while trying to login." diff --git a/apps/login/locales/es.json b/apps/login/locales/es.json index cd969eeff..0d93bb10b 100644 --- a/apps/login/locales/es.json +++ b/apps/login/locales/es.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Iniciar sesión con AzureAD", "signInWithGithub": "Iniciar sesión con GitHub", "signInWithGitlab": "Iniciar sesión con GitLab", + "signInWithZitadel": "Iniciar sesión con Zitadel", "loginError": { "title": "Error de inicio de sesión", "description": "Ocurrió un error al intentar iniciar sesión." diff --git a/apps/login/locales/fr.json b/apps/login/locales/fr.json index 7de1f4ec1..0fdd73b69 100644 --- a/apps/login/locales/fr.json +++ b/apps/login/locales/fr.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Se connecter avec AzureAD", "signInWithGithub": "Se connecter avec GitHub", "signInWithGitlab": "Se connecter avec GitLab", + "signInWithZitadel": "Se connecter avec Zitadel", "loginError": { "title": "Échec de la connexion", "description": "Une erreur est survenue lors de la tentative de connexion." diff --git a/apps/login/locales/hu.json b/apps/login/locales/hu.json index 925544838..26e9067ad 100644 --- a/apps/login/locales/hu.json +++ b/apps/login/locales/hu.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Bejelentkezés AzureAD-vel", "signInWithGithub": "Bejelentkezés GitHubbal", "signInWithGitlab": "Bejelentkezés GitLabbal", + "signInWithZitadel": "Bejelentkezés Zitadel-lel", "loginError": { "title": "Sikertelen bejelentkezés", "description": "Hiba történt a bejelentkezés során." diff --git a/apps/login/locales/it.json b/apps/login/locales/it.json index f4c0d2f9e..f25ae68d5 100644 --- a/apps/login/locales/it.json +++ b/apps/login/locales/it.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Accedi con AzureAD", "signInWithGithub": "Accedi con GitHub", "signInWithGitlab": "Accedi con GitLab", + "signInWithZitadel": "Accedi con Zitadel", "loginError": { "title": "Accesso fallito", "description": "Si è verificato un errore durante il tentativo di accesso." diff --git a/apps/login/locales/ja.json b/apps/login/locales/ja.json index c03d45446..8c8da9bbc 100644 --- a/apps/login/locales/ja.json +++ b/apps/login/locales/ja.json @@ -157,6 +157,7 @@ "signInWithAzureAD": "AzureADでサインイン", "signInWithGithub": "GitHubでサインイン", "signInWithGitlab": "GitLabでサインイン", + "signInWithZitadel": "Zitadelでサインイン", "loginError": { "title": "ログイン失敗", "description": "ログインの際にエラーが発生しました。" diff --git a/apps/login/locales/nl.json b/apps/login/locales/nl.json index 25722bc72..f1cd4a0c2 100644 --- a/apps/login/locales/nl.json +++ b/apps/login/locales/nl.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Aanmelden met AzureAD", "signInWithGithub": "Aanmelden met GitHub", "signInWithGitlab": "Aanmelden met GitLab", + "signInWithZitadel": "Aanmelden met Zitadel", "loginError": { "title": "Inloggen mislukt", "description": "Er is een fout opgetreden tijdens het inloggen." diff --git a/apps/login/locales/pl.json b/apps/login/locales/pl.json index bdc65f3aa..c269cd13e 100644 --- a/apps/login/locales/pl.json +++ b/apps/login/locales/pl.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Zaloguj się przez AzureAD", "signInWithGithub": "Zaloguj się przez GitHub", "signInWithGitlab": "Zaloguj się przez GitLab", + "signInWithZitadel": "Zaloguj się przez Zitadel", "loginError": { "title": "Logowanie nieudane", "description": "Wystąpił błąd podczas próby logowania." diff --git a/apps/login/locales/pt.json b/apps/login/locales/pt.json index 47292bb4d..3ab36cd73 100644 --- a/apps/login/locales/pt.json +++ b/apps/login/locales/pt.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Entrar com AzureAD", "signInWithGithub": "Entrar com GitHub", "signInWithGitlab": "Entrar com GitLab", + "signInWithZitadel": "Entrar com Zitadel", "loginError": { "title": "Falha no login", "description": "Ocorreu um erro ao tentar fazer login." diff --git a/apps/login/locales/ru.json b/apps/login/locales/ru.json index 4d4732f97..b0e2b3424 100644 --- a/apps/login/locales/ru.json +++ b/apps/login/locales/ru.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Войти через AzureAD", "signInWithGithub": "Войти через GitHub", "signInWithGitlab": "Войти через GitLab", + "signInWithZitadel": "Войти через Zitadel", "loginError": { "title": "Ошибка входа", "description": "Произошла ошибка при попытке входа." diff --git a/apps/login/locales/tr.json b/apps/login/locales/tr.json index d24a32ea2..591053ae0 100644 --- a/apps/login/locales/tr.json +++ b/apps/login/locales/tr.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "AzureAD ile Giriş", "signInWithGithub": "GitHub ile Giriş", "signInWithGitlab": "GitLab ile Giriş", + "signInWithZitadel": "Zitadel ile Giriş", "loginError": { "title": "Giriş başarısız", "description": "Giriş yapılmaya çalışılırken bir hata oluştu." diff --git a/apps/login/locales/uk.json b/apps/login/locales/uk.json index cb0705c85..35d35820b 100644 --- a/apps/login/locales/uk.json +++ b/apps/login/locales/uk.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "Увійти через AzureAD", "signInWithGithub": "Увійти через GitHub", "signInWithGitlab": "Увійти через GitLab", + "signInWithZitadel": "Увійти через Zitadel", "loginError": { "title": "Помилка входу", "description": "Сталася помилка під час спроби входу." diff --git a/apps/login/locales/zh.json b/apps/login/locales/zh.json index 5cb3bb1c8..564e9d146 100644 --- a/apps/login/locales/zh.json +++ b/apps/login/locales/zh.json @@ -164,6 +164,7 @@ "signInWithAzureAD": "用 AzureAD 登录", "signInWithGithub": "用 GitHub 登录", "signInWithGitlab": "用 GitLab 登录", + "signInWithZitadel": "用 Zitadel 登录", "loginError": { "title": "登录失败", "description": "登录时发生错误。" diff --git a/apps/login/src/components/idps/sign-in-with-zitadel.tsx b/apps/login/src/components/idps/sign-in-with-zitadel.tsx new file mode 100644 index 000000000..f5acb9b5d --- /dev/null +++ b/apps/login/src/components/idps/sign-in-with-zitadel.tsx @@ -0,0 +1,187 @@ +"use client"; + +import { forwardRef, useId } from "react"; +import { Translated } from "../translated"; +import { BaseButton, SignInWithIdentityProviderProps } from "./base-button"; + +export const SignInWithZitadel = forwardRef( + function SignInWithZitadel(props, ref) { + const { children, name, ...restProps } = props; + // Unique per component instance: multiple ZITADEL IdPs can be rendered on + // the same page, and duplicate SVG gradient ids would be invalid HTML. + const gradientId = useId().replace(/:/g, ""); + + return ( + +
+ +
+ {children ? ( + children + ) : ( + {name ? name : } + )} +
+ ); + }, +); diff --git a/apps/login/src/components/sign-in-with-idp.tsx b/apps/login/src/components/sign-in-with-idp.tsx index a2f3d5b32..e3e8566c0 100644 --- a/apps/login/src/components/sign-in-with-idp.tsx +++ b/apps/login/src/components/sign-in-with-idp.tsx @@ -13,6 +13,7 @@ import { SignInWithGeneric } from "./idps/sign-in-with-generic"; import { SignInWithGithub } from "./idps/sign-in-with-github"; import { SignInWithGitlab } from "./idps/sign-in-with-gitlab"; import { SignInWithGoogle } from "./idps/sign-in-with-google"; +import { SignInWithZitadel } from "./idps/sign-in-with-zitadel"; import { Translated } from "./translated"; export interface SignInWithIDPProps { @@ -51,6 +52,7 @@ export function SignInWithIdp({ [IdentityProviderType.SAML]: SignInWithGeneric, [IdentityProviderType.LDAP]: SignInWithGeneric, [IdentityProviderType.JWT]: SignInWithGeneric, + [IdentityProviderType.ZITADEL]: SignInWithZitadel, }; const Component = components[type]; diff --git a/apps/login/src/lib/idp.test.ts b/apps/login/src/lib/idp.test.ts index db9141df0..bfaff32c7 100644 --- a/apps/login/src/lib/idp.test.ts +++ b/apps/login/src/lib/idp.test.ts @@ -65,6 +65,11 @@ describe("idp type mapping utilities", () => { expect(result).toBe("jwt"); }); + it("should map ZITADEL to 'zitadel'", () => { + const result = idpTypeToSlug(IdentityProviderType.ZITADEL); + expect(result).toBe("zitadel"); + }); + it("should throw error for unknown identity provider type", () => { // Using a value that doesn't match any known type const unknownType = 9999 as IdentityProviderType; @@ -92,6 +97,7 @@ describe("idp type mapping utilities", () => { IdentityProviderType.OIDC, IdentityProviderType.LDAP, IdentityProviderType.JWT, + IdentityProviderType.ZITADEL, ]; handledTypes.forEach((type) => { @@ -178,6 +184,11 @@ describe("idp type mapping utilities", () => { expect(result).toBe(IdentityProviderType.JWT); }); + it("should map IDP_TYPE_ZITADEL to ZITADEL", () => { + const result = idpTypeToIdentityProviderType(IDPType.IDP_TYPE_ZITADEL); + expect(result).toBe(IdentityProviderType.ZITADEL); + }); + it("should throw error for unknown IDP type", () => { // Using a value that doesn't match any known type const unknownType = 9999 as IDPType; @@ -203,6 +214,7 @@ describe("idp type mapping utilities", () => { IDPType.IDP_TYPE_OAUTH, IDPType.IDP_TYPE_OIDC, IDPType.IDP_TYPE_JWT, + IDPType.IDP_TYPE_ZITADEL, ]; handledTypes.forEach((type) => { @@ -310,6 +322,7 @@ describe("idp type mapping utilities", () => { IdentityProviderType.OAUTH, IdentityProviderType.LDAP, IdentityProviderType.JWT, + IdentityProviderType.ZITADEL, ]; const slugs = types.map((type) => idpTypeToSlug(type)); diff --git a/apps/login/src/lib/idp.ts b/apps/login/src/lib/idp.ts index b9b874a3e..916e7e90f 100644 --- a/apps/login/src/lib/idp.ts +++ b/apps/login/src/lib/idp.ts @@ -28,6 +28,8 @@ export function idpTypeToSlug(idpType: IdentityProviderType) { return "ldap"; case IdentityProviderType.JWT: return "jwt"; + case IdentityProviderType.ZITADEL: + return "zitadel"; default: throw new Error("Unknown identity provider type"); } @@ -69,6 +71,9 @@ export function idpTypeToIdentityProviderType(idpType: IDPType): IdentityProvide case IDPType.IDP_TYPE_JWT: return IdentityProviderType.JWT; + case IDPType.IDP_TYPE_ZITADEL: + return IdentityProviderType.ZITADEL; + default: throw new Error("Unknown identity provider type"); } diff --git a/internal/api/idp/idp.go b/internal/api/idp/idp.go index 888933855..3de0a7701 100644 --- a/internal/api/idp/idp.go +++ b/internal/api/idp/idp.go @@ -35,6 +35,7 @@ import ( "github.com/zitadel/zitadel/internal/idp/providers/oauth" openid "github.com/zitadel/zitadel/internal/idp/providers/oidc" saml2 "github.com/zitadel/zitadel/internal/idp/providers/saml" + "github.com/zitadel/zitadel/internal/idp/providers/zitadel" "github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/zerrors" ) @@ -555,6 +556,8 @@ func (h *Handler) fetchIDPUserFromCode(ctx context.Context, identityProvider idp session = openid.NewSession(provider.Provider, code, idpArguments) case *google.Provider: session = openid.NewSession(provider.Provider, code, idpArguments) + case *zitadel.Provider: + session = openid.NewSession(provider.Provider, code, idpArguments) case *apple.Provider: session = apple.NewSession(provider, code, appleUser) case *jwt.Provider, *ldap.Provider, *saml2.Provider: