Florian Forster c5f272bb30 fix(login): guard remaining credential and device flows against 500s on user errors
Second pass of the business-error-vs-500 cleanup: extend the
catchUserError pattern (user errors resolve to the `{ error }` shape the
forms render; genuine server faults keep throwing) to the flows the first
pass deferred.

- u2f: addU2F/verifyU2F no longer crash the action POST when the session
  is gone or the WebAuthn attestation is rejected (InvalidArgument); all
  error strings are translated now.
- passkeys: verifyPasskeyRegistration adopts the `{ error }` convention
  (it previously only threw), registerPasskeyLink guards every service
  call and stops contradicting its own return type with raw throws, and
  sendPasskey no longer fails a completed passkey login because the
  post-login settings lookup failed. The register-passkey component now
  checks the verify response for an error instead of treating it as
  success.
- device authorization: an expired or already-used device code returns a
  translated error instead of a 500; the signedin page's dead error JSX
  (returned from a discarded .catch) is now actually rendered, the
  consent screen handles the new shape, and the consent page treats an
  unknown user-supplied user_code as the existing no-device-request state
  instead of crashing SSR.
- LDAP/IDP: wrong LDAP credentials — previously a 500 on every failed
  LDAP login — return a check-your-credentials error;
  redirectToIdp/startIDPFlow and createNewSessionFromIdpIntent guard
  removed/misconfigured IDPs and expired intents, with messages
  translated.
- password: resetPassword no longer leaks throws from users in
  non-resettable states; sendPassword guards its post-auth user and
  auth-method reads; the two getLockoutSettings calls inside catch
  handlers can no longer escape the handler; and the bare catch that
  swallowed *all* setSession errors now rethrows genuine server faults
  instead of hiding outages behind a silent session-recreate retry.
- enrollment-guard: the authorization gate fails closed (never open) when
  the user's auth methods cannot be read due to a user error, and keeps
  throwing on server faults.
- oidc/saml: the invalid-session re-auth path degrades gracefully when
  sendLoginname rejects with a user error.
- idp-intent: internal error messages no longer leak into the
  user-visible failure-page URL; only classified user errors carry their
  message through.
- Locales: 14 new keys (u2f/passkey.set/device/ldap/idp error messages)
  across all 15 locale files, reusing each locale's existing sibling
  translations where they exist.

Unit tests cover the new behaviors (attestation/LDAP/device-code user
errors resolve, server faults rethrow, guard fails closed); suite is at
877 tests across 57 files.
2026-08-07 08:02:35 -07:00
2023-07-17 10:08:20 +02:00
2024-07-26 22:39:55 +02:00
2021-02-08 16:48:41 +01:00
2025-04-02 16:53:06 +02:00
2026-02-04 11:51:43 +01:00
2026-06-04 14:33:04 +02:00
2026-02-25 19:36:00 -03:00
2026-06-10 11:53:26 +00:00

ZITADEL Logo ZITADEL Logo

GitHub Workflow Status (with event) GitHub contributors

The Identity Infrastructure for Developers

ZITADEL is an open-source identity and access management platform built for teams that need more than basic auth. Whether you're securing a SaaS product, building a B2B platform, or self-hosting a production IAM stack — ZITADEL gives you everything out of the box: SSO, MFA, Passkeys, OIDC, SAML, SCIM, and a battle-tested multi-tenancy model.

No vendor lock-in. No compromise on control. Just a robust, API-first identity platform you can own.


🏡 Website  |  💬 Chat  |  📋 Docs  |  🧑‍💻 Blog  |  📞 Contact


Why ZITADEL

We built ZITADEL to handle the hardest IAM challenges at scale — starting with multi-tenancy.

ZITADEL FusionAuth Keycloak Auth0/Okta
Open-source ✅ ❌ ✅ ❌
Self-hostable ✅ ✅ ✅ ❌
Infrastructure-level tenants ✅ Instances (High scale) ✅ Tenants 🟡 Realms (Scaling limits) ❌ (Multi-tenant = multi-account)
B2B Organizations ✅ Native & Unlimited 🟡 via Entity Management ✅ (Recent addition) 🟡 (Plan/Account dependent)
Full audit trail ✅ Comprehensive Event Stream* 🟡 Audit logs 🟡 Audit logs 🟡 Audit logs
Passkeys (FIDO2) ✅ ✅ ✅ ✅
Actions / webhooks ✅ ✅ 🟡 via SPI ✅
API-first (gRPC + REST) ✅ 🟡 REST only 🟡 REST only 🟡 REST only
SaaS + self-host parity ✅ ✅ ➖ N/A ➖ N/A

ZITADEL Cloud and self-hosted ZITADEL run the same codebase.

Key differentiators for architects:

  • Relational core, event-driven soul — every mutation is written as an immutable event for a complete, API-accessible audit trail. Unlike systems that log only select activities, ZITADEL provides a comprehensive event stream that can be audited or streamed to external systems via Webhooks.
  • Strict multi-tenant hierarchy — Identity System → Organizations → Projects, with isolated data and policy scoping at multiple levels
  • API-first design — every resource and action is available via connectRPC, gRPC, and HTTP/JSON APIs
  • Zero-downtime updates and horizontal scalability without external session stores

Get Started in 3 Minutes

👉 Quick Start Guide

ZITADEL Self-Hosted

# Docker Compose — up and running in under 3 minutes
curl -LO https://raw.githubusercontent.com/zitadel/zitadel/main/deploy/compose/docker-compose.yml \
  && curl -LO https://raw.githubusercontent.com/zitadel/zitadel/main/deploy/compose/.env.example \
  && cp .env.example .env \
  && docker compose up -d --wait

Full deployment guides:

Need professional support for your self-hosted deployment? Contact us.

ZITADEL Cloud (SaaS)

Start for free at zitadel.com — no credit card required. Available in US · EU · AU · CH. Pay-as-you-go pricing.


Integrate with the V2 API

ZITADEL exposes every capability over a typed API. Here's how to create a user with the V2 REST API:

curl -X POST https://$ZITADEL_DOMAIN/v2/users/human \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "alice@example.com",
    "profile": { "givenName": "Alice", "familyName": "Smith" },
    "email": { "email": "alice@example.com", "sendCode": {} }
  }'

Explore the full API reference — including connectRPC and gRPC transports — or jump straight to quickstart examples.


Features

Authentication

Multi-Tenancy

Integration

Self-Service & Admin

Deployment

Track upcoming features on our roadmap and follow our changelog for recent updates.


Showcase

Login V2

Our new, fully customizable login experience — documentation


Adopters & Ecosystem

Used in production by organizations worldwide. See the full Adopters list — and add yours by submitting a pull request.


How To Contribute

ZITADEL is built in the open and welcoming to contributions of all kinds.

Contributors

Made with contrib.rocks.


Security

Security policy: SECURITY.md

Vulnerability Disclosure Policy — how to responsibly report security issues.

Technical Advisories are published for major issues that could impact security or stability in production.

License

AGPL-3.0 — see LICENSING.md for the full licensing policy, including Apache 2.0 and MIT exceptions for specific directories.

Languages
Go 74.4%
TypeScript 12.3%
MDX 7.9%
HTML 2.6%
SCSS 1.1%
Other 1.7%