Authagonal
Documentation
Everything you need to get started with Authagonal — from creating your first tenant to wiring SSO, SCIM, and custom branding.
Erste Schritte
Authagonal stellt jedem Mandanten einen vollständig standardkonformen OIDC-Server bereit. Jeder Mandant erhält seine eigene Issür-URL, sein eigenes Discovery-Dokument und eigene Token-Endpunkte -- keine gemeinsam genutzte Infrastruktur zwischen Mandanten. Sie können in unter 5 Minuten von null zu einem funktionierenden Anmeldefluss gelangen.
Mandant erstellen
Registrieren Sie sich auf authagonal.io und wählen Sie einen Slug für Ihren Mandanten. Der Slug wird Ihre Issür-Domain: {slug}.authagonal.io. Nach der Kontörstellung verifizieren Sie Ihre E-Mail-Adresse, um den Mandanten zu aktivieren.

Wählen Sie bei der Registrierung einen eindeutigen Slug für Ihren Mandanten
Client registrieren
Navigieren Sie zu Clients in der Portal-Seitenleiste und klicken Sie auf Erstellen. Geben Sie eine clientId und einen clientName für Ihre Anwendung ein. Konfigurieren Sie dann mindestens eine Redirect-URI -- dorthin werden Benutzer nach der Authentifizierung weitergeleitet. Beispiel: https://app.example.com/callback.

Neuen OAuth-Client im Portal registrieren
Lokale Entwicklung
http://localhost:3000/callback als Redirect-URI für die lokale Entwicklung. Authagonal erlaubt nicht-HTTPS-Redirect-URIs für localhost-Ursprünge.Ihre erste Anmeldung
Der schnellste Weg zur Integration ist mit oidc-client-ts, einer leichtgewichtigen OIDC-Client-Bibliothek für JavaScript- und TypeScript-Anwendungen.
import { UserManager } from 'oidc-client-ts';
const mgr = new UserManager({
authority: 'https://acme.authagonal.io',
client_id: 'my-app',
redirect_uri: 'https://app.example.com/callback',
response_type: 'code',
scope: 'openid profile email',
});
// Redirect to login
mgr.signinRedirect();
// On callback page
const user = await mgr.signinRedirectCallback();
console.log(user.profile); // { sub, email, name, ... }Wenn Sie einen minimalen Ansatz ohne Bibliothek bevorzugen, können Sie den Standard-OAuth 2.0-Authorization-Code-Flow mit einfachem fetch verwenden:
// 1. Redirect the user to the authorization endpoint
const authorizeUrl = new URL('https://acme.authagonal.io/connect/authorize');
authorizeUrl.searchParams.set('client_id', 'my-app');
authorizeUrl.searchParams.set('redirect_uri', 'https://app.example.com/callback');
authorizeUrl.searchParams.set('response_type', 'code');
authorizeUrl.searchParams.set('scope', 'openid profile email');
authorizeUrl.searchParams.set('code_challenge', codeChallenge);
authorizeUrl.searchParams.set('code_challenge_method', 'S256');
window.location.href = authorizeUrl.toString();
// 2. On the callback page, exchange the code for tokens
const res = await fetch('https://acme.authagonal.io/connect/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'authorization_code',
code: new URLSearchParams(window.location.search).get('code')!,
redirect_uri: 'https://app.example.com/callback',
client_id: 'my-app',
code_verifier: codeVerifier,
}),
});
const tokens = await res.json();
// tokens.id_token, tokens.access_token, tokens.refresh_token
Die Standard-Anmeldeseite für Ihren Mandanten
Sandbox-Modus
{slug}-sandbox.authagonal.io) und können jederzeit von der Produktion aktualisiert werden, ohne Live-Benutzer zu beeinträchtigen.Dashboard
Das Portal-Dashboard gibt Ihnen einen Echtzeit-Überblick über Ihren Mandanten. Es zeigt die wichtigsten Metriken -- Benutzerwachstum, Authentifizierungsaktivität und schnelle Navigation zu allen Funktionen im Portal.
Übersicht
Oben im Dashboard sehen Sie eine Willkommensnachricht zusammen mit Ihrer aktüllen Gesamtbenutzerzahl. Darunter zeigt ein Täglich aktive Benutzer-Diagramm eine 7-Tage-Historie eindeutiger Benutzer, die sich täglich authentifiziert haben, und gibt Ihnen einen schnellen Überblick über Engagement-Trends.

Der Dashboard-Startbildschirm mit DAU-Diagramm und Aktivitätsübersicht
Aktivitätsmetriken
Das Aktivitätsmetriken-Panel zeigt vier Statistikkarten mit einer Zusammenfassung wichtiger Authentifizierungsereignisse:
- Erfolgreiche Anmeldungen -- insgesamt abgeschlossene Authentifizierungsabläufe
- Fehlgeschlagene Anmeldungen -- falsche Anmeldedaten, gesperrte Konten oder Richtlinienablehnungen
- Aktive Benutzer -- eindeutige Benutzer, die sich im ausgewählten Zeitraum authentifiziert haben
- SCIM-Operationen -- Benutzer- und Gruppenbereitstellungsereignisse von verbundenen IdPs
Verwenden Sie die Zeitbereichsfilter, um zwischen 24 Stunden, 3 Tagen, 7 Tagen und 30 Tagen zu wechseln. Alle Statistikkarten und Diagramme aktualisieren sich entsprechend dem ausgewählten Fenster.

Aktivitätsmetriken mit konfigurierbarem Zeitbereich
Schnellnavigation
Unterhalb des Metriken-Panels verlinken Navigationskarten direkt zu allen wichtigen Funktionen: Clients, Benutzer, Gruppen, Rollen, SSO, SCIM, Branding und Einstellungen. Jede Karte zeigt eine kurze Beschreibung, damit sich neue Teammitglieder schnell orientieren können.
Clients
OAuth-Clients repräsentieren die Anwendungen, die Benutzer über Ihren Mandanten authentifizieren. Jeder Client hat seine eigene Konfiguration für Redirect-URIs, Scopes, Grant-Typen, Token-Laufzeiten und MFA-Richtlinie.
Client-Liste
Die Clients-Seite zeigt eine Tabelle aller registrierten Clients. Jede Zeile zeigt die clientId, den Anzeigenamen, erlaubte Grant-Typen als farbige Badges und ob PKCE aktiviert ist. Klicken Sie auf eine Zeile, um den vollständigen Konfigurationseditor zu oeffnen.

Client-Liste mit Grant-Type-Badges und PKCE-Indikatoren
Client erstellen
Klicken Sie auf Client erstellen, um eine neue Anwendung zu registrieren. Sie müssen zwei Felder angeben:
clientId-- ein eindeutiger Bezeichner für den Client (z. B.my-spa)clientName-- ein lesbarer Anzeigename

Neuen OAuth-Client registrieren
Client löschen
Um einen Client zu löschen, oeffnen Sie die Client-Konfiguration und klicken Sie auf die Schaltfläche Client löschen am Ende der Seite. Sie werden zur Bestätigung aufgefordert, bevor der Client dauerhaft entfernt wird. Alle aktiven Sitzungen und Tokens für den gelöschten Client werden sofort ungültig.
Client-Konfigurationsreferenz
Jeder Client verfügt über einen umfassenden Satz von Konfigurationsoptionen, die in mehrere Abschnitte gegliedert sind.
Allgemeine Einstellungen
| Einstellung | Beschreibung | Standard |
|---|---|---|
clientName | Anzeigename, der in Zustimmungsbildschirmen und im Portal angezeigt wird | — |
requirePkce | Proof Key for Code Exchange für Authorization-Code-Flows erforderlich machen | An |
requireClientSecret | Client-Secret für Token-Anfragen erforderlich machen (für öffentliche Clients wie SPAs deaktivieren) | Aus |
allowOfflineAccess | Dem Client erlauben, Refresh-Tokens über den offline_access-Scope anzufordern | Aus |
alwaysIncludeUserClaimsInIdToken | Alle Benutzer-Claims direkt im ID-Token einschließen, anstatt einen UserInfo-Aufruf zu erfordern | Aus |
includeGroupsInTokens | Die Gruppenmitgliedschaften des Benutzers als groups-Claim im ID-Token einschließen | Aus |
PKCE-Sicherheit
URIs
URI-Felder verwenden eine Tag-Eingabe -- geben Sie einen Wert ein und drücken Sie Enter oder Komma, um ihn hinzuzufügen. Klicken Sie auf das X eines Tags, um es zu entfernen.
| Einstellung | Beschreibung |
|---|---|
redirectUris | Erlaubte Callback-URLs nach der Authentifizierung. Müssen exakt mit dem redirect_uri-Parameter in Autorisierungsanfragen übereinstimmen. |
postLogoutRedirectUris | Erlaubte URLs für die Weiterleitung nach dem Logout. |
allowedCorsOrigins | Erlaubte Origins für Cross-Origin-Anfragen an die Token- und UserInfo-Endpunkte. |

Tag-Eingabefelder zur Konfiguration von URIs
Scopes & Grant-Typen
| Einstellung | Optionen |
|---|---|
allowedScopes | openid profile email offline_access |
allowedGrantTypes | authorization_code client_credentials refresh_token device_code |
Token-Laufzeiten
| Einstellung | Beschreibung | Standard |
|---|---|---|
accessTokenLifetimeSeconds | Gültigkeitsdauer von Access-Tokens | 1800 (30 Min.) |
identityTokenLifetimeSeconds | Gültigkeitsdauer von ID-Tokens | 300 (5 Min.) |
authorizationCodeLifetimeSeconds | Gültigkeitsdauer von Authorization Codes für den Austausch | 300 (5 Min.) |
absoluteRefreshTokenLifetimeSeconds | Maximale Lebensdauer eines Refresh-Tokens unabhängig von der Aktivität | 2592000 (30 Tage) |
slidingRefreshTokenLifetimeSeconds | Refresh-Token-Ablauf wird bei jeder Verwendung zurückgesetzt, bis zur absoluten Lebensdauer | 1296000 (15 Tage) |

Token-Laufzeiten pro Client konfigurieren
Logout-URIs
Clients können sowohl Back-Channel- als auch Front-Channel-Logout-URIs registrieren. Beide sind optional — konfigurieren Sie das, was zu Ihrer Anwendung passt.
| Einstellung | Beschreibung |
|---|---|
backChannelLogoutUri | Server-zu-Server-POST mit einem signierten Logout-Token. Zuverlässig, auch wenn der Browser offline ist. |
frontChannelLogoutUri | Wird in einem versteckten iframe beim Logout geladen, damit der Browser Cookies und Local Storage löscht. |
frontChannelLogoutSessionRequired | Wenn aktiviert, erhält die Logout-URL die Query-Parameter iss und sid, damit Ihre App den Logout mit der spezifischen Sitzung verknüpfen kann. |
Beide kombinieren
MFA-Richtlinie
Jeder Client kann die mandantenweite MFA-Richtlinie mit einer clientspezifischen Einstellung überschreiben. Das MFA-Richtlinien-Dropdown bietet drei Optionen:
| Richtlinie | Verhalten |
|---|---|
| Deaktiviert | MFA wird für diesen Client nie abgefragt |
| Aktiviert | Benutzer können sich optional für MFA registrieren; sie werden bei der Anmeldung aufgefordert, wenn registriert |
| Erforderlich | Alle Benutzer müssen MFA abschließen, um sich über diesen Client zu authentifizieren |

Clientspezifische MFA-Richtlinien-Überschreibung
Enterprise SSO
Enterprise SSO ermöglicht es Ihren Kunden, ihren eigenen Identity Provider mitzubringen. Authagonal unterstützt sowohl SAML 2.0- als auch OIDC-Federation mit domänbasiertem Routing, sodass Benutzer anhand ihrer E-Mail-Adresse automatisch zum richtigen IdP weitergeleitet werden.
Domänbasiertes SSO-Routing
SAML 2.0-Verbindungen
Um eine SAML-Verbindung zu erstellen, navigieren Sie zur SSO-Seite und wählen Sie den SAML-Tab. Geben Sie Folgendes an:
| Feld | Beschreibung |
|---|---|
connectionName | Ein lesbarer Name für diese Verbindung (z. B. "Acme Corp Okta") |
entityId | Die SAML Entity ID des externen Identity Providers |
metadataUrl | URL zum SAML-Metadaten-XML-Dokument des IdP |
Wenn Sie die Verbindung speichern, ruft Authagonal das Metadatendokument ab und importiert das Signaturzertifikat des IdP, die SSO-Endpunkt-URL und das Name-Identifier-Format. Die Metadaten werden regelmäßig aktualisiert, um Zertifikatsrotationen zu berücksichtigen.

SAML 2.0 SSO-Verbindung erstellen
OIDC-Verbindungen
Um eine OIDC-Federation-Verbindung zu erstellen, wählen Sie den OIDC-Tab und geben Sie an:
| Feld | Beschreibung |
|---|---|
connectionName | Ein lesbarer Name für diese Verbindung |
discoveryUrl | Die OpenID Connect Discovery-URL (z. B. https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration) |
clientId | Die beim externen IdP für diese Federation registrierte Client-ID |
clientSecret | Das Client-Secret für die Registrierung beim externen IdP |

OIDC-Federation-Verbindung erstellen
Domain-Routing
Domain-Routing leitet Benutzer automatisch zum richtigen Identity Provider basierend auf ihrer E-Mail-Domain weiter. Wenn ein Benutzer seine E-Mail auf der Anmeldeseite eingibt, prüft Authagonal, ob der Domain-Teil (z. B. acme.com) mit einer konfigurierten SSO-Verbindung übereinstimmt. Falls ja, wird der Benutzer nahtlos zum IdP seiner Organisation weitergeleitet.
| E-Mail-Domain | SSO-Anbieter | Protokoll |
|---|---|---|
| acme.com | Acme Corp Okta | SAML 2.0 |
| contoso.com | Contoso Azure AD | OIDC |
| example.org | Example OneLogin | SAML 2.0 |

Domain-Routing ordnet E-Mail-Domains Identity Providern zu
SP-initiierter Flow
/saml/{connectionId}/login oder /oidc/{connectionId}/login.JIT-Bereitstellung
Standardmäßig erstellt Authagonal automatisch ein Konto, wenn sich ein Benutzer zum ersten Mal über SSO anmeldet und noch nicht in Ihrem Mandanten existiert (Just-In-Time-Bereitstellung). Dies kann pro Verbindung deaktiviert werden, indem Sie beim Erstellen oder Bearbeiten der Verbindung JIT-Bereitstellung deaktivieren ankreuzen.
Wenn die JIT-Bereitstellung deaktiviert ist, können sich nur Benutzer anmelden, die vorab bereitgestellt wurden -- über SCIM, die Benutzerseite des Portals oder die API. Unbekannte Benutzer erhalten einen access_denied-Fehler und werden aufgefordert, ihren Administrator zu kontaktieren.
Einstellung pro Verbindung
Vor dem Rollout testen
Benutzer
Die Benutzerseite ermöglicht es Ihnen, alle Endbenutzer in Ihrem Mandanten zu verwalten. Sie können nach Benutzern suchen, deren Details anzeigen, neue Konten erstellen und sehen, wie jeder Benutzer bereitgestellt wurde.
Suche & Seitenumbruch
Die Suchleiste unterstützt die Filterung nach E-Mail-Adresse oder Benutzer-ID. Die Suche ist mit 300ms Verzögerung entprellt, sodass Ergebnisse während der Eingabe aktualisiert werden, ohne die API zu überlasten. Ergebnisse werden mit 50 Benutzern pro Seite paginiert -- verwenden Sie die Navigationssteuerungen am Ende der Tabelle, um zwischen Seiten zu wechseln.
Benutzertabelle
Die Benutzertabelle zeigt die folgenden Spalten für jeden Benutzer:
| Spalte | Beschreibung |
|---|---|
| Die E-Mail-Adresse des Benutzers, mit einem Verifizierungsbadge angezeigt, wenn die E-Mail bestätigt wurde | |
| Benutzer-ID | Der dem Benutzer zugewiesene eindeutige Bezeichner |
| Vollständiger Name | Vor- und Nachname kombiniert |
| Status | Active oder Inactive — gibt an, ob das Konto aktiviert ist |
| MFA | Enabled oder Off — ob Multi-Faktor-Authentifizierung registriert ist |
| Quelle | SCIM oder Local — wie der Benutzer erstellt wurde |
| Erstellt | Das Datum, an dem das Benutzerkonto erstellt wurde |

Die Benutzerliste mit Suchleiste und Seitenumbruch
Benutzer erstellen
Klicken Sie auf Benutzer erstellen, um einen neuen lokalen Benutzer hinzuzufügen. Das Formular erfordert:
| Feld | Beschreibung |
|---|---|
email | Die E-Mail-Adresse des Benutzers (muss innerhalb des Mandanten eindeutig sein) |
password | Anfangspasswort (mindestens 8 Zeichen, muss der Passwortrichtlinie Ihres Mandanten entsprechen) |
firstName | Der Vorname des Benutzers |
lastName | Der Nachname des Benutzers |

Neuen lokalen Benutzer erstellen
SCIM-bereitgestellte Benutzer
Benutzerdetails
Klicken Sie auf eine Zeile in der Benutzerliste, um die Detailseite zu öffnen. Dort können Sie Profildaten bearbeiten, Rollen verwalten, MFA zurücksetzen, benutzerdefinierte Attribute überprüfen und den Benutzer löschen.
Profil
Bearbeiten Sie E-Mail, Vor-/Nachname, Telefon, Unternehmen, externe ID und den Aktiv-Status des Benutzers. E-Mail-Änderungen müssen innerhalb des Mandanten eindeutig bleiben; die API gibt email_in_use zurück, wenn die Adresse belegt ist.
Rollen
Weisen Sie Rollen zu, die auf der Seite Rollen definiert sind. Rollenmitgliedschaften werden in ID- und Access-Tokens eingeschlossen, wenn der Client includeRolesInTokens aktiviert hat.
Multi-Faktor-Authentifizierung
Sehen Sie alle für den Benutzer registrierten MFA-Zugangsdaten — Authenticator-App (TOTP), WebAuthn/Passkeys und Wiederherstellungscodes — jeweils mit Registrierungs- und Letzter-Nutzung-Zeitstempeln. Entfernen Sie einzelne Zugangsdaten oder setzen Sie alle MFA zurück. Zurücksetzen zwingt den Benutzer, sich bei der nächsten Anmeldung neu zu registrieren.
Benutzerdefinierte Attribute
Beliebige Schlüssel-Wert-Daten, die dem Benutzer zugeordnet sind. Schlüssel müssen eindeutig sein. Attribute sind über die Benutzerprofil-API und SCIM verfügbar und können durch Konfiguration der userClaims eines benutzerdefinierten Scopes auf Access-Token-Claims abgebildet werden.
Benutzer löschen
Entfernt den Benutzer und alle seine MFA-Zugangsdaten dauerhaft. Geben Sie die E-Mail des Benutzers zur Bestätigung ein — es gibt kein Rückgängigmachen.
Gruppen
Gruppen ermöglichen es Ihnen, Benutzer zu organisieren und Gruppenmitgliedschaften in Tokens aufzunehmen. Gruppen können manüll im Portal erstellt oder automatisch über SCIM von einem externen Identity Provider bereitgestellt werden.
Gruppenliste
Die Gruppenseite zeigt alle Gruppen in Ihrem Mandanten mit den folgenden Informationen:
| Spalte | Beschreibung |
|---|---|
| Gruppenname | Der Anzeigename der Gruppe |
| Mitglieder | Die Anzahl der Benutzer, die derzeit in der Gruppe sind |
| Quelle | SCIM oder Manual — wie die Gruppe erstellt wurde |
| Erstellt | Das Datum, an dem die Gruppe erstellt wurde |

Gruppenliste mit Quellindikatoren
Gruppe erstellen
Klicken Sie auf Gruppe erstellen und geben Sie einen displayName für die Gruppe ein. Gruppennamen sollten beschreibend und innerhalb Ihres Mandanten eindeutig sein (z. B. "Engineering", "Billing Admins", "Beta Testers").
Gruppendetails & Mitglieder
Klicken Sie auf eine Gruppe, um die Detailansicht zu oeffnen. Hier können Sie alle aktüllen Mitglieder sehen und die Mitgliedschaft verwalten:
- Mitglieder hinzufügen -- Geben Sie eine Benutzer-ID ein, um einen Benutzer zur Gruppe hinzuzufügen.
- Mitglieder entfernen -- Klicken Sie auf die Entfernen-Schaltfläche neben einem Mitglied, um es einzeln zu entfernen.

Gruppenmitgliedschaft in der Detailansicht verwalten
Gruppen in Tokens
Wenn includeGroupsInTokens auf einem Client aktiviert ist, enthält das ID-Token einen groups-Claim mit den Gruppenmitgliedschaften des Benutzers. Jeder Eintrag enthält die Gruppen-id und den name:
{
"sub": "user-123",
"email": "jane@acme.com",
"groups": [
{ "id": "grp-001", "name": "Engineering" },
{ "id": "grp-002", "name": "Beta Testers" }
]
}Pro Client aktivieren
includeGroupsInTokens wird auf jedem Client einzeln konfiguriert. Navigieren Sie zu den allgemeinen Einstellungen des Clients, um sie zu aktivieren.Rollen
Rollen unterstützen die rollenbasierte Zugriffskontrolle (RBAC) in Ihrer Anwendung. Definieren Sie Rollen in Authagonal, weisen Sie sie Benutzern zu und verwenden Sie den roles-Claim in Tokens, um die Autorisierung in Ihrer Anwendungslogik durchzusetzen.
Rollen verwalten
Die Rollenseite zeigt eine Tabelle aller definierten Rollen mit Inline-Bearbeitung. Jede Rolle hat:
| Spalte | Beschreibung |
|---|---|
| Name | Ein eindeutiger Bezeichner für die Rolle (z. B. "admin", "editor", "viewer") |
| Beschreibung | Eine lesbare Beschreibung dessen, was die Rolle gewährt |
| Erstellt | Das Datum, an dem die Rolle erstellt wurde |
Rolle erstellen
Klicken Sie auf Rolle erstellen und geben Sie einen Namen und eine Beschreibung an. Rollennamen sollten prägnant sein und einer einheitlichen Namenskonvention in Ihrer Anwendung folgen (z. B. Kleinschreibung mit Bindestrichen: billing-admin).
Inline-Bearbeitung
Rollen unterstützen die Inline-Bearbeitung direkt in der Tabelle. Klicken Sie auf das Stiftsymbol bei einer Rolle, um den Bearbeitungsmodus zu aktivieren -- die Felder für Name und Beschreibung werden bearbeitbar. Ändern Sie die Werte und klicken Sie dann auf das Häkchensymbol zum Speichern. Änderungen werden sofort wirksam.
Rolle löschen
Klicken Sie auf das Löschsymbol bei einer Rolle, um sie zu entfernen. Sie werden zur Bestätigung aufgefordert, bevor die Rolle dauerhaft gelöscht wird. Das Entfernen einer Rolle macht bestehende Tokens nicht rückwirkend ungültig -- die Rolle fehlt in neuen Tokens, die nach der Löschung ausgestellt werden.

Inline-Bearbeitung von Rollen in der Rollentabelle
Rollen in Tokens
Einem Benutzer zugewiesene Rollen werden als roles-Claim im ID-Token aufgenommen. Ihre Anwendung kann diesen Claim lesen, um Autorisierungsentscheidungen zu treffen:
{
"sub": "user-123",
"email": "jane@acme.com",
"roles": ["admin", "billing-admin"]
}SCIM-Bereitstellung
SCIM 2.0 (System for Cross-domain Identity Management) ermöglicht die automatische Benutzer- und Gruppenbereitstellung von Enterprise-Identity-Providern wie Okta, Azure AD, OneLogin und JumpCloud. Bei Konfiguration werden Benutzerkonten und Gruppenmitgliedschaften automatisch vom vorgelagerten IdP mit Ihrem Authagonal-Mandanten synchronisiert.
SCIM-Benutzerlebenszyklus-Synchronisation mit nachgelagerter Bereitstellung
Einrichtungsschritte
Befolgen Sie diese Schritte, um die SCIM-Bereitstellung für einen Client zu aktivieren:
- Client-Anwendung auswählen -- Wählen Sie den OAuth-Client, dem die SCIM-Bereitstellung zugeordnet wird.
- SCIM-Token generieren -- Geben Sie eine Beschreibung und einen Ablaufzeitraum in Tagen an und generieren Sie dann den Token.
- Token sofort kopieren -- Der Roh-Token-Wert wird nur einmal angezeigt. Kopieren Sie ihn, bevor Sie den Dialog schliessen.
- IdP konfigurieren -- Geben Sie in den SCIM-Einstellungen Ihres Identity Providers die Basis-URL und das Bearer-Token ein.
- Benutzersynchronisation testen -- Lösen Sie eine Testsynchronisation von Ihrem IdP aus und überprüfen Sie, ob Benutzer im Authagonal-Portal erscheinen.
SCIM-Basis-URL
Konfigurieren Sie Ihren Identity Provider mit der folgenden Basis-URL:
https://{slug}.authagonal.io/scim/v2Ersetzen Sie {slug} durch Ihren Mandanten-Slug.

SCIM-Einrichtungsseite mit Token-Generierung
Token-Verwaltung
SCIM-Tokens authentifizieren Bereitstellungsanfragen von Ihrem IdP. Sie können mehrere Tokens pro Client verwalten:
| Feld | Beschreibung |
|---|---|
| Beschreibung | Ein Label zur Identifizierung des Tokens (z. B. "Okta Production SCIM") |
| Ablauf | Token-Lebensdauer in Tagen (1 bis 3650). Leer lassen oder einen hohen Wert setzen für Tokens, die nicht häufig rotiert werden sollen. |
| Status | Aktive Tokens sind in Verwendung. Widerrufene Tokens zeigen ein Revoked Badge an und können keine Anfragen mehr authentifizieren. |
Um einen Token zu widerrufen, klicken Sie auf die Schaltfläche Widerrufen daneben. Widerrufene Tokens bleiben aus Audit-Gründen in der Liste sichtbar, akzeptieren aber sofort keine Anfragen mehr.

Token-Verwaltung mit Indikatoren für aktive und widerrufene Tokens
Token sofort kopieren
Konnektivität testen
Überprüfen Sie, ob Ihre SCIM-Integration funktioniert, indem Sie den ServiceProviderConfig-Endpunkt abfragen:
curl -H "Authorization: Bearer YOUR_TOKEN" \ https://acme.authagonal.io/scim/v2/ServiceProviderConfig
Eine erfolgreiche Antwort gibt ein JSON-Dokument zurück, das die unterstützten SCIM-Funktionen beschreibt, einschliesslich Massenoperationen, Filterung und Passwortänderungsfähigkeit.
OAuth-Scopes
Scopes ermöglichen Clients, bestimmte Teile der Benutzerdaten oder Berechtigungen anzufordern. Authagonal unterstützt sowohl Standard-OIDC-Scopes als auch benutzerdefinierte Scopes für Ihre APIs.
Integrierte Scopes
| Scope | Beschreibung |
|---|---|
openid | Erforderlich für jeden OpenID-Connect-Flow. Gibt ein ID-Token aus. |
profile | Liefert Standard-Profilclaims (name, given_name, family_name). |
email | Liefert E-Mail-Adresse und Verifizierungsstatus des Benutzers. |
offline_access | Gibt neben dem Access-Token auch ein Refresh-Token aus. |
Benutzerdefinierte Scopes
Definieren Sie eigene Scopes auf der Scopes-Seite. Jeder Scope beschreibt eine Berechtigung oder Ressource, die ein Client anfordern kann (z. B. billing.read, orders.write).
| Feld | Beschreibung |
|---|---|
name | Der Scope-Identifier, der in Token-Anfragen gesendet wird (z. B. billing.read). |
displayName | Benutzerfreundliche Bezeichnung auf dem Zustimmungsbildschirm. |
description | Längere Erklärung unter dem Anzeigenamen bei der Zustimmung. |
userClaims | Zusätzliche Claims, die dem Access-Token hinzugefügt werden, wenn der Scope gewährt wird. |
showInDiscoveryDocument | Wenn aktiviert, erscheint der Scope in /.well-known/openid-configuration. |
emphasize | Hebt den Scope auf der Zustimmungsseite als sensibel hervor. |
required | Verhindert, dass der Benutzer den Scope bei der Zustimmung abwählen kann. |
Integration der Zustimmung
Benutzerdefinierte Claims auf Tokens
Benutzerdefinierte Claims haben zwei Hälften. Die Quelle sind benutzerbezogene Daten: Jeder AuthUser besitzt ein customAttributes-Dictionary, das Sie über das Portal (Benutzer → Benutzer → Benutzerdefinierte Attribute), per SCIM oder über einen TCC-Provisioning-Hook befüllen können. Die Freigabe erfolgt pro Scope: Die userClaims-Liste jedes Scopes nennt die Schlüssel, die den Server verlassen dürfen.
Wenn ein Client Scopes anfordert, durchläuft Authagonal die gewährten Scopes, vereinigt deren userClaims-Listen und gibt nur diese Schlüssel aus den customAttributes des Benutzers aus. Unbekannte Schlüssel werden stillschweigend verworfen — ein Client kann ein Attribut nicht durch Erraten des Namens lesen. Standard-OIDC-Claims (sub, email, name usw.) folgen der Spezifikation und unterliegen nicht der Whitelist.
# 1. On the user (Portal → Users → {user} → Custom Attributes)
department = "engineering"
employee_id = "E-1042"
seat_tier = "enterprise"
# 2. On a custom scope (Portal → Scopes → projects.read)
name = "projects.read"
userClaims = ["department", "seat_tier"] # <-- whitelist
# 3. Client requests scope=openid projects.read
# Decoded access token (relevant fields only):
{
"sub": "u-9b…",
"scope": "openid projects.read",
"department": "engineering",
"seat_tier": "enterprise"
// employee_id is NOT emitted — it's not in the whitelist for any granted scope.
}Föderations-Claims haben Vorrang pro Sitzung
department-Attribut — durch dieselbe Scope-Whitelist, gewinnen aber bei Schlüsselkollisionen gegen die persistierten customAttributes. Sie werden auf den Tokens dieser Sitzung ausgegeben (und überleben Refresh-Rotationen), ohne in den Benutzerdatensatz zurückgeschrieben zu werden.Scopes an Clients zuweisen
Fügen Sie erlaubte Scopes auf der Registerkarte Clients → Scopes & Grants hinzu. Ein Client kann nur Scopes anfordern, die ihm zugewiesen wurden; unbekannte Scopes werden mit invalid_scope abgelehnt.
Branding
Passen Sie das Erscheinungsbild der Anmeldeseiten Ihres Mandanten an. Branding-Einstellungen ermöglichen es Ihnen, das Authentifizierungserlebnis an die visülle Identität Ihres Produkts anzupassen -- von Logos und Farben bis hin zu erweiterten CSS-Überschreibungen.
Erscheinungsbild
| Einstellung | Beschreibung |
|---|---|
appName | Der Anwendungsname, der in der Kopfzeile der Anmeldeseite und im Browser-Tab angezeigt wird |
logoUrl | URL zu Ihrem Logo-Bild. Wird oben auf der Anmeldeseite angezeigt. Empfohlene Größe: 200x60px oder ähnliches Seitenverhältnis. |
primaryColor | Die primäre Markenfarbe für Schaltflächen, Links und Fokuszustände. Einstellbar über eine Farbauswahl oder Hex-Eingabe. Eine Live-Vorschau aktualisiert sich, wenn Sie den Wert ändern. |
customCssUrl | URL zu einer externen CSS-Datei, die nach den Standardstilen geladen wird. Verwenden Sie diese für erweiterte Styling-Überschreibungen. |

Erscheinungseinstellungen mit Live-Farbvorschau
Kontaktinformationen
| Einstellung | Beschreibung |
|---|---|
supportEmail | Eine Support-E-Mail-Adresse, die auf Anmeldeseiten angezeigt wird. Benutzer sehen diese, wenn sie Hilfe mit ihrem Konto benötigen. |
Anmeldeseiten-Schalter
Steuern Sie, welche Elemente auf der Anmeldeseite Ihres Mandanten angezeigt werden:
| Schalter | Beschreibung | Standard |
|---|---|---|
showForgotPassword | Den "Passwort vergessen?"-Link im Anmeldeformular anzeigen | An |
showRegistration | Den "Registrieren"-Link für Self-Service-Benutzerregistrierung anzeigen | An |
showPoweredBy | Das "Powered by Authagonal"-Badge am Ende der Anmeldeseite anzeigen | An |

Beispiel-Anmeldeseite mit angewendetem individüllem Branding
Eigenes CSS
Für vollständige Kontrolle über das Aussehen der Login-Seite geben Sie eine CSS-Datei-URL in Ihren Branding-Einstellungen an. Die Datei wird nach den Standard-Styles geladen, sodass Ihre Regeln Vorrang haben.
CSS-Custom-Properties
| Variable | Beschreibung | Standard |
|---|---|---|
--auth-bg | Seiten-Hintergrundfarbe | #f3f4f6 |
--auth-card-bg | Hintergrund der Login-Karte | white |
--auth-heading | Farbe des Überschriftentexts | #111827 |
--auth-radius | Eckenradius der Karte | 0.5rem |
--auth-font | Schriftfamilie | inherit |
Dunkler Modus
Die Login-App bietet helle, dunkle und System-Designs. Benutzer wählen über einen Umschalter auf der Login-Seite; die Auswahl bleibt über Sitzungen hinweg erhalten. Bei system folgt die SPA dem Systemwert prefers-color-scheme in Echtzeit.
Helle Werte werden in :root deklariert; dunkle Überschreibungen sind auf .dark beschränkt. Tenant-Branding über customCssUrl hat immer Vorrang — Ihre Farben bleiben unabhängig vom gewählten Design erhalten.
Element-Selektoren
data-auth-Attribute ansprechen. Diese Selektoren sind über Updates hinweg stabil — sie brechen nicht, wenn wir interne Klassennamen ändern.| Selektor | Element |
|---|---|
[data-auth="page"] | Hintergrund-Container der gesamten Seite |
[data-auth="header"] | Bereich für Logo und App-Name |
[data-auth="logo"] | Logo-Bild |
[data-auth="app-name"] | App-Name-Überschrift (wenn kein Logo gesetzt ist) |
[data-auth="content"] | Hauptinhaltsbereich (Formulare, Meldungen) |
[data-auth="login-form"] | Login-Formular-Element |
[data-auth="email-field"] | E-Mail-Eingabe-Wrapper |
[data-auth="password-field"] | Passwort-Eingabe-Wrapper |
[data-auth="submit-button"] | Anmelde-Schaltfläche |
[data-auth="languages"] | Sprachauswahl-Leiste |
Einstellungen
Konfigurieren Sie mandantenweite Sicherheitsrichtlinien, Webhooks und Umgebungseinstellungen. Diese Einstellungen gelten global für alle Clients, sofern sie nicht auf Client-Ebene überschrieben werden.
Passwortrichtlinie
Definieren Sie die Passwortkomplexitätsanforderungen für alle Benutzer in Ihrem Mandanten:
| Einstellung | Bereich | Standard |
|---|---|---|
minPasswordLength | 6 – 128 | 8 |
requireUppercase | An / Aus | An |
requireLowercase | An / Aus | An |
requireDigit | An / Aus | An |
requireSpecialChar | An / Aus | An |

Konfiguration der Passwortrichtlinie
MFA-Richtlinie
Die mandantenweite MFA-Richtlinie legt das Standard-Verhalten für Multi-Faktor-Authentifizierung fest. Einzelne Clients können diese Einstellung überschreiben.
| Richtlinie | Verhalten |
|---|---|
Disabled | MFA ist nicht verfügbar. Benutzer können sich nicht für MFA registrieren. |
Enabled | MFA ist optional. Benutzer können sich für MFA registrieren und werden bei der Anmeldung aufgefordert, wenn registriert. |
Required | MFA ist verpflichtend. Alle Benutzer müssen sich für MFA registrieren und bei jeder Anmeldung einen zweiten Faktor abschließen. |
Sitzung & Sperrung
Steuern Sie die Sitzungsdauer und das Kontosperrungsverhalten:
| Einstellung | Bereich | Standard |
|---|---|---|
sessionLifetimeMinutes | 5 – 43.200 (30 Tage) | 60 |
maxFailedAttempts | 1 – 100 | 5 |
lockoutDurationMinutes | 1 – 1.440 (24 Stunden) | 10 |

Sitzungs- und Sperrungskonfiguration
Webhooks
Webhooks ermöglichen die Echtzeit-Reaktion auf Authentifizierungsereignisse. Zwei Ereignisse (onUserAuthenticated, onTokenIssued) sind erzwingbar — standardmäßig laufen sie asynchron und blockieren den Benutzer nicht, aber Sie können pro Ereignis Erzwingung aktivieren, sodass eine Antwort, die nicht 2xx ist, oder ein {"allow": false}-Body die Aktion ablehnt. Die übrigen Ereignisse sind Benachrichtigungen — immer „fire-and-forget", blockieren nie.
| Ereignis | Typ | Beschreibung |
|---|---|---|
onUserAuthenticated | Erzwingbar | Wird nach einer erfolgreichen Anmeldung aufgerufen. Standardmäßig „fire-and-forget", sodass die Anmeldelatenz unbeeinflusst bleibt. Aktivieren Sie <code>webhookEnforceUserAuthenticated</code>, um den Aufruf blockierend zu machen — eine Antwort, die nicht 2xx ist, oder ein <code>{"allow": false}</code>-Body lehnt dann die Anmeldung ab. |
onTokenIssued | Erzwingbar | Wird vor der Token-Ausstellung aufgerufen (authorization_code, refresh_token, client_credentials). Standardmäßig „fire-and-forget". Aktivieren Sie <code>webhookEnforceTokenIssued</code>, um den Aufruf blockierend zu machen — eine Antwort, die nicht 2xx ist, oder ein <code>{"allow": false}</code>-Body verhindert dann die Token-Ausstellung. |
onUserCreated | Benachrichtigung | Fire-and-Forget-Benachrichtigung, wenn ein neuer Benutzer sich registriert oder über SCIM bereitgestellt wird. |
onUserUpdated | Benachrichtigung | „Fire-and-forget"-Benachrichtigung, wenn ein Benutzerdatensatz aktualisiert wird (Profiländerungen, Rollenänderungen, SCIM-Updates). |
onUserDeleted | Benachrichtigung | „Fire-and-forget"-Benachrichtigung, wenn ein Benutzer gelöscht wird, entweder per Portal/SCIM oder durch die Aufbewahrungsrichtlinie. |
onLoginFailed | Benachrichtigung | Fire-and-Forget-Benachrichtigung, wenn ein Anmeldeversuch aufgrund falscher Anmeldedaten, Sperrung oder Richtlinienablehnung fehlschlägt. |
Zusätzliche Webhook-Einstellungen:
| Einstellung | Bereich | Standard | Beschreibung |
|---|---|---|---|
webhookTimeoutSeconds | 1 – 30 | 5 | Maximale Wartezeit auf eine Antwort eines Durchsetzungs-Webhooks vor dem Timeout |
webhookFailOpen | An / Aus | An | Wenn aktiviert und ein Durchsetzungs-Webhook nicht erreichbar ist oder ein Timeout hat, wird der Vorgang fortgesetzt |

Webhook-Ereigniskonfiguration
Verfügbarkeit von Durchsetzungs-Webhooks
webhookFailOpen deaktiviert ist, kann sich kein Benutzer anmelden. Verwenden Sie den Fail-Open-Modus, es sei denn, Sie haben strenge Compliance-Anforderungen, die ein Blockieren bei Webhook-Ausfall vorschreiben.Webhooks verifizieren
Sobald eine Webhook-URL konfiguriert ist, erzeugt Authagonal ein mandantenspezifisches Signaturgeheimnis (einen whsec_…-Wert, der unter Einstellungen → Webhooks schreibgeschützt angezeigt wird). Jede ausgehende Zustellung trägt einen X-Authagonal-Signature: t=<unix>,v1=<hex>-Header, wobei v1 gleich HMAC-SHA256(secret, "{t}.{body}") ist, berechnet über den rohen Anfrage-Body. Berechnen Sie ihn an Ihrem Endpunkt neu und vergleichen Sie ihn in konstanter Zeit, um zu bestätigen, dass die Anfrage tatsächlich von Authagonal stammt und nicht manipuliert wurde — und weisen Sie Zustellungen zurück, deren t zu alt ist, um Replays zu blockieren.
import crypto from 'node:crypto';
// rawBody MUST be the exact bytes Authagonal sent — verify before any JSON re-serialization.
function verifyAuthagonalWebhook(signatureHeader, rawBody, signingSecret) {
const parts = Object.fromEntries(signatureHeader.split(',').map((p) => p.split('=')));
const { t, v1 } = parts;
// Replay protection: reject deliveries older than 5 minutes.
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
const expected = crypto
.createHmac('sha256', signingSecret)
.update(`${t}.${rawBody}`)
.digest('hex');
return v1.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}Das Signaturgeheimnis rotieren
Wartungsfenster
Legen Sie ein bevorzugtes Wartungsfenster für störende Operationen wie Zertifikatsrotationen und Infrastrukturaktualisierungen fest. Wählen Sie eine UTC-Stunde (0-23) -- das Portal zeigt zur Vereinfachung auch die entsprechende Zeit in Ihrer lokalen Zeitzone an.
Sandbox-Umgebung
Die Sandbox-Umgebung ist ein vollständiger Klon Ihres Produktionsmandanten, verfügbar unter einer separaten URL. Verwenden Sie sie, um Konfigurationsänderungen, SSO-Integrationen und Webhook-Endpunkte zu testen, ohne Live-Benutzer zu beeinträchtigen.
| Aktion | Beschreibung |
|---|---|
| Sandbox aktivieren | Erstellt eine Sandbox-Kopie Ihres Produktionsmandanten. Die Sandbox-URL ist Ihr Mandanten-Slug mit dem Suffix -sandbox. |
| Von Live aktualisieren | Synchronisiert die Sandbox-Umgebung mit der aktuellen Produktionskonfiguration und den Benutzerdaten. |
| Sandbox deaktivieren | Löscht die Sandbox-Umgebung und alle zugehörigen Daten dauerhaft. |
Die Sandbox ist erreichbar unter {slug}-sandbox.authagonal.io.

Sandbox-Umgebungssteuerungen
Abrechnung
Verwalten Sie Ihr Abonnement und Ihre Abrechnung über die Abrechnungsseite des Portals. Diese Seite gibt Ihnen einen Überblick über Ihren aktüllen Tarif und bietet Zugang zum Stripe-Abrechnungsportal für die Verwaltung von Zahlungsmethoden, Rechnungen und Tarifänderungen.
Abonnementinformationen
Die Abrechnungsseite zeigt Ihre aktüllen Abonnementdetails auf einen Blick. Sie sehen ein Statusbadge, das Ihren Abonnementstatus anzeigt -- active, trialing, past_due, canceled oder unpaid -- zusammen mit Ihrem Tarifnamen, dem aktüllen Abrechnungszeitraum (Start- und Enddatum) und ob Ihr Abonnement zum Ende des aktüllen Zeitraums gekündigt wird.
Abonnement verwalten
Klicken Sie auf die Schaltfläche Abonnement verwalten, um das Stripe-Abrechnungsportal in einem neuen Fenster zu oeffnen. Dort können Sie Ihre Zahlungsmethoden aktualisieren, Rechnungen einsehen und herunterladen, Ihren Tarif ändern oder Ihr Abonnement kündigen.
Wenn noch kein Abonnement besteht, wird stattdessen eine Abrechnung einrichten-Handlungsaufforderung angezeigt, die Sie durch die Tarifauswahl und Eingabe der Zahlungsdaten führt.

Die Abrechnungsseite zeigt Ihre aktüllen Abonnementdetails und bietet Zugang zu Stripe
Zahlungssicherheit
Eigene Domains
Stellen Sie Ihre Authentifizierungsseiten über Ihre eigene Domain bereit (z. B. auth.ihredomain.com) anstelle der Standard-Domain {slug}.authagonal.io. Eigene Domains bieten Ihren Benutzern ein nahtloses, markenkonsistentes Authentifizierungserlebnis.
Domain hinzufügen
Geben Sie den Hostnamen ein, den Sie verwenden möchten (z. B. auth.ihredomain.com). Nach dem Hinzufügen erscheint die Domain in Ihrer Domainliste mit dem Status pending_verification.
DNS-Verifizierung
Erstellen Sie einen CNAME-Eintrag, der Ihre Domain auf {slug}.authagonal.io verweist. Sobald der DNS-Eintrag vorhanden ist, klicken Sie auf Verifizieren, um die DNS-Propagierung zu prüfen.
auth.yourdomain.com. CNAME acme.authagonal.io.
DNS-Propagierung
TLS-Zertifikate
Sobald Ihre Domain verifiziert ist, benötigen Sie ein TLS-Zertifikat, damit Benutzer sicher über HTTPS verbinden können. Authagonal unterstützt zwei Optionen:
Automatisch (cert-manager) -- Authagonal stellt TLS-Zertifikate automatisch über cert-manager bereit und erneuert sie. Dies ist die empfohlene Option für die meisten Benutzer. Keine zusätzliche Konfiguration erforderlich.
Eigenes Zertifikat (BYO) -- Laden Sie Ihr eigenes Zertifikat und Ihren privaten Schlüssel im PEM-Format hoch. Diese Option ist nützlich, wenn Ihre Organisation Zertifikate von einer bestimmten Zertifizierungsstelle verlangt. Der Zertifikatsablauf wird verfolgt, damit Sie vor dem Ablauf erneuern können.
Domain-Status
Jede Domain zeigt ein Statusbadge an, das ihren aktüllen Zustand angibt: pending_verification (DNS noch nicht bestätigt), verified (DNS bestätigt, TLS ausstehend), active (voll funktionsfähig) oder failed (Konfigurationsproblem erkannt).

Die Domainliste zeigt jede eigene Domain und ihren aktüllen Status

Laden Sie Ihr eigenes TLS-Zertifikat und Ihren privaten Schlüssel im PEM-Format hoch
BYO-Zertifikatserneuerung
E-Mail-Konfiguration
Konfigurieren Sie, wie Ihr Tenant Transaktions-E-Mails sendet — Verifizierung, Passwort-Reset und MFA-Benachrichtigungen. Wählen Sie zwischen dem Standard-Shared-Sender, einer verifizierten eigenen Domain über Resend oder Ihrem eigenen SMTP-Server.
E-Mail-Anbieter
| Anbieter | Beschreibung | Einrichtung |
|---|---|---|
| Default | E-Mails werden von noreply@authagonal.io über unsere gemeinsame Resend-Infrastruktur gesendet. | Keine Konfiguration erforderlich — funktioniert sofort. |
| Resend Custom Domain | E-Mails werden von Ihrer eigenen verifizierten Domain über Resend gesendet. | Domain registrieren, DNS-Einträge hinzufügen, Eigentümerschaft verifizieren. |
| Custom SMTP | E-Mails werden über Ihren eigenen SMTP-Server gesendet. | SMTP-Host, -Port, Zugangsdaten und TLS-Einstellungen angeben. |
Absenderidentität
Absender-E-Mail und -Name werden über alle Anbieter-Modi hinweg geteilt. Die Absender-E-Mail ist erforderlich; der Absendername fällt auf den Tenant-Namen zurück, wenn leer.
| Feld | Beschreibung |
|---|---|
senderEmail | Die From-Adresse für ausgehende E-Mails. Muss bei Resend Custom Domain eine verifizierte Domain sein. |
senderName | Anzeigename, der im Posteingang des Empfängers angezeigt wird. |
Resend Custom Domain
Verifizieren Sie Ihre Versanddomäne einmalig bei Resend und verwenden Sie sie dann als Absenderadresse für diesen Tenant. Die DNS-TXT-Einträge (SPF, DKIM) werden auf der Domains-Seite bereitgestellt; Resend validiert sie automatisch.
Eigenes SMTP
Bringen Sie Ihren eigenen SMTP-Server mit — nützlich für interne Relays, Anbieter ohne Resend-Abdeckung oder regulatorische Bindung.
| Feld | Beschreibung |
|---|---|
host | SMTP-Server-Hostname (z. B. smtp.example.com). |
port | Verbindungsport. 587 für STARTTLS, 465 für implizites TLS, 25 für nicht authentifizierte interne Relays. |
username | Auth-Benutzername (optional — leer lassen für nicht authentifizierte Relays). |
password | Auth-Passwort. Verschlüsselt im Tenant-Settings-Secret gespeichert. |
useTls | TLS erforderlich. Lassen Sie es aktiviert, es sei denn, Sie zielen auf ein vertrauenswürdiges internes Relay ab. |
Eigene Versanddomäne
Mit dem Resend-Anbieter können Sie Ihre eigene Domain registrieren, damit E-Mails von Ihrer Marke (z. B. noreply@acme.com) statt @authagonal.io gesendet werden.
- Gehen Sie zu Einstellungen → E-Mail und wählen Sie den Anbieter Resend Custom Domain.
- Geben Sie Ihren Domainnamen ein und klicken Sie auf Registrieren.
- Fügen Sie die angezeigten DNS-Einträge (DKIM, SPF und Return-Path) zu Ihrem Domain-DNS hinzu.
- Klicken Sie auf Verifizierung prüfen — sobald das DNS propagiert ist (meist 1–10 Minuten), wechselt der Domain-Status auf verifiziert.
DNS-Propagation
Testen
Verwenden Sie die Schaltfläche Test-E-Mail senden unter Einstellungen → E-Mail, um Ihre Konfiguration zu überprüfen. Eine Test-E-Mail wird mit den aktuell gespeicherten Einstellungen an Ihre Admin-E-Mail-Adresse gesendet.
Audit-Protokoll
Das Audit-Protokoll bietet eine schreibgeschützte Aufzeichnung aller administrativen Aktionen, die auf Ihrem Mandanten durchgeführt wurden. Jede über das Portal oder die API vorgenommene Änderung wird mit vollständigem Kontext erfasst und bietet einen lückenlosen Nachweis für Compliance und Fehlerbehebung.
Protokollspalten
| Spalte | Beschreibung |
|---|---|
| Zeitstempel | Datum und Uhrzeit, zu der die Aktion ausgeführt wurde |
| Akteur | Die E-Mail-Adresse des Administrators, der die Aktion ausgeführt hat, oder "system" für automatisierte Aktionen |
| Aktion | Die Art der ausgeführten Aktion (z. B. Client erstellt, Einstellungen aktualisiert) |
| Entität | Das Ziel der Aktion im Format typ:id (z. B. client:my-app) |
| Detail | Zusätzlicher Kontext zur Änderung |
Erfasste Aktionen
Die folgenden administrativen Aktionen werden im Audit-Protokoll erfasst:
| Kategorie | Aktionen |
|---|---|
| Clients | Client erstellt, Client aktualisiert, Client gelöscht |
| SSO-Verbindungen | SAML-Verbindung erstellt, SAML-Verbindung gelöscht, OIDC-Verbindung erstellt, OIDC-Verbindung gelöscht |
| Benutzer | Benutzer erstellt, Benutzer aktualisiert |
| Einstellungen | Einstellungen aktualisiert, Branding aktualisiert |
| Domains | Domain hinzugefügt, Domain verifiziert, Domain gelöscht |
| SCIM | SCIM-Token erstellt, SCIM-Token widerrufen |
| Rollen | Rolle erstellt, Rolle aktualisiert, Rolle gelöscht |
| Gruppen | Gruppe erstellt, Gruppe gelöscht |
| Team | Teammitglied eingeladen, Teammitglied entfernt |

Das Audit-Protokoll bietet eine vollständige Aufzeichnung aller administrativen Aktionen
Aufbewahrung
Backups
Authagonal sichert Ihre Tenant-Daten automatisch stündlich. Backups umfassen alle Benutzer, Gruppen, Rollen, Clients, SSO-Verbindungen, SCIM-Tokens, Branding und Einstellungen. Sie können die Backup-Historie einsehen und das neueste vollständige Backup auf der Backups-Seite herunterladen.

So funktionieren Backups
- Ein vollständiges Backup läuft einmal täglich und erfasst jede Tabelle im Storage-Shard Ihres Tenants.
- Inkrementelle Backups laufen stündlich und erfassen nur die Zeilen, die sich seit dem letzten Backup geändert haben.
- Backups werden in Azure Blob Storage mit der gleichen Managed Identity gespeichert, die Ihr Tenant verwendet.
- Gelöschte Datensätze werden über Tombstones verfolgt und aus Auditgründen in Backups eingeschlossen.
Backups herunterladen
Klicken Sie auf „Neueste herunterladen", um eine ZIP-Datei mit dem neuesten Voll-Backup zusammengeführt mit allen nachfolgenden inkrementellen Backups zu erhalten. Jede Tabelle wird als JSONL-Datei exportiert (ein JSON-Objekt pro Zeile).
Backup-Format
Bereitstellungs-Apps
Bereitstellungs-Apps erhalten Echtzeit-Webhook-Benachrichtigungen, wenn Benutzer in Ihrem Mandanten erstellt oder authentifiziert werden. Dies ermöglicht es nachgelagerten Systemen, automatisch Konten einzurichten, Lizenzen zuzuweisen oder Benutzerdaten zu synchronisieren, ohne manülles Eingreifen.
Funktionsweise
Wenn ein Benutzerereignis eintritt (Erstellung oder Authentifizierung), ruft Authagonal die Callback-URL Ihrer Bereitstellungs-App unter Verwendung des TCC (Try/Confirm/Cancel)-Musters auf. Dieser dreiphasige Ansatz gewährleistet zuverlässige Bereitstellung über mehrere nachgelagerte Systeme:
| Phase | Endpunkt | Zweck |
|---|---|---|
| /try | POST {callbackUrl}/try | Prüft, ob die App den Benutzer verarbeiten kann. 200 zurückgeben, um zu akzeptieren, oder 4xx, um abzulehnen. |
| /confirm | POST {callbackUrl}/confirm | Bestätigt den Vorgang, nachdem alle Apps die /try-Phase akzeptiert haben. |
| /cancel | POST {callbackUrl}/cancel | Macht den Vorgang rückgängig, wenn eine andere App während der /try-Phase fehlschlägt. |
Webhook-Payload
Jede Webhook-Anfrage enthält ein JSON-Payload mit den folgenden Feldern:
| Feld | Typ | Beschreibung |
|---|---|---|
| event | string | Der Ereignistyp (z. B. user.created, user.authenticated) |
| userId | string | Der eindeutige Bezeichner des Benutzers |
| string | Die E-Mail-Adresse des Benutzers | |
| name | string | Der Anzeigename des Benutzers |
| tenantId | string | Ihr Mandantenbezeichner |
| timestamp | string | ISO 8601-Zeitstempel des Ereignisses |
Bereitstellungs-App hinzufügen
Um eine Bereitstellungs-App hinzuzufügen, geben Sie einen Namen, eine Callback-URL und einen optionalen API-Schlüssel an. Der API-Schlüssel wird als Bearer-Token im Authorization-Header jeder Webhook-Anfrage gesendet, sodass Ihre App Anfragen von Authagonal authentifizieren kann.
Testen
Klicken Sie auf Testen neben einer Bereitstellungs-App, um eine Testanfrage an Ihre Callback-URL zu senden. Die Testergebnisse zeigen den HTTP-Statuscode und den Antworttext, damit Sie überprüfen können, ob Ihre App Webhooks korrekt empfängt und verarbeitet.

Bereitstellungs-Apps testen, um Webhook-Zustellung und Antwortverarbeitung zu überprüfen
Tarif-Limits
Die maximale Anzahl an Bereitstellungs-Apps ist pro Mandant konfigurierbar, mit einem Standardlimit von 6. Dieses Limit kann von einem Administrator angepasst werden, wenn Ihr Workflow zusätzliche Bereitstellungsziele erfordert.
API-Schlüssel-Authentifizierung
Team
Die Teamseite verwaltet Portal-Administratoren -- die Personen, die auf Ihren Mandanten über das Verwaltungsportal zugreifen und ihn konfigurieren können. Alle Teammitglieder haben vollständigen administrativen Zugriff auf jeden Aspekt Ihrer Mandantenkonfiguration.
Administratorenliste
Die Administratorenliste zeigt den Namen, die E-Mail-Adresse und das Hinzufügedatum jedes Teammitglieds. Ein "Sie"-Indikator wird neben der Zeile des aktüllen Benutzers angezeigt, damit Sie Ihr eigenes Konto leicht identifizieren können.
Administratoren einladen
Um ein neues Teammitglied einzuladen, geben Sie dessen E-Mail-Adresse, Namen und ein temporäres Passwort (mindestens 8 Zeichen) an. Der eingeladene Benutzer meldet sich mit dem temporären Passwort an und sollte es bei der ersten Anmeldung ändern.
Einladungsfelder
Admin-Einladungen erstellen einen vollständig bereitgestellten Benutzer — kein E-Mail-Roundtrip erforderlich.
| Feld | Beschreibung |
|---|---|
email | E-Mail-Adresse des neuen Admins. Muss im Mandanten eindeutig sein. |
name | Anzeigename in der Adminliste. |
tempPassword | Temporäres Passwort, das der Eingeladene bei der ersten Anmeldung verwendet. Er wird zum Ändern aufgefordert. Leer lassen, um automatisch zu generieren und per E-Mail zu senden. |
Administratoren entfernen
Klicken Sie auf Entfernen neben einem Teammitglied, um dessen Zugriff zu widerrufen. Ein Bestätigungsdialog wird angezeigt, bevor die Entfernung abgeschlossen wird. Sie können sich nicht selbst entfernen -- es muss immer mindestens ein Administrator im Team vorhanden sein.

Portal-Administratoren über die Teamseite verwalten
Keine Eigentümer-Rolle
Importieren & migrieren
Migrieren Sie ein bestehendes Identitätssystem in Ihren Authagonal-Mandanten. Zwei Quellen werden unterstützt — Duende IdentityServer (eine SQL-Server-Datenbank) und Auth0 (die Management API). Jede führt eine schreibgeschützte Vorschau aus, damit Sie genau prüfen können, was kopiert wird, bevor Sie etwas übernehmen.
Import aus Duende IdentityServer
Migrieren Sie Clients, Scopes, Benutzer und Rollen aus einer bestehenden Duende-IdentityServer-SQL-Server-Datenbank in Ihren Authagonal-Mandanten. Der Import läuft in zwei Phasen — Vorschau und Commit — damit Sie prüfen können, was kopiert wird, bevor etwas geschrieben wird.
Was importiert wird
Der Importer liest aus Duendes ConfigurationDb und den ASP.NET-Identity-Tabellen und schreibt die zugeordneten Zeilen in Ihren Mandanten. Kurzlebige Artefakte wie Persisted Grants, Device Codes und Signaturschlüssel werden übersprungen.
| Entität | Quelltabellen | Hinweise |
|---|---|---|
| Clients | Clients, ClientSecrets, ClientGrantTypes, ClientScopes, ClientRedirectUris | Deaktivierte Clients werden deaktiviert importiert. Abgelaufene Secrets werden übersprungen. |
| Scopes | ApiScopes, ApiResources, IdentityResources | Benutzer-Claim-Zuordnungen werden übernommen, soweit erkannt. |
| Benutzer | AspNetUsers, AspNetUserClaims | Passwort-Hashes (ASP.NET Identity V3) werden unverändert kopiert und beim ersten Login neu gehasht. |
| Rollen | AspNetRoles, AspNetUserRoles | Rollenzuweisungen bleiben erhalten. |
| Externe Anmeldungen | AspNetUserLogins | Zur Referenz gespeichert; externe IdPs nach dem Import über SSO neu verbinden. |
Vorschau vor Commit
Fügen Sie Ihren Verbindungs-String zur ConfigurationDb / IdentityDb ein und klicken Sie auf Vorschau ausführen. Die Vorschau öffnet eine Read-only-Verbindung und zählt jede Zeile, die importiert würde — ohne etwas zu schreiben.
- Anzahl der Entitäten für Clients, Scopes, Benutzer, Rollen und Rollenzuweisungen.
- Besitzerkonflikte — Mandanten-Admins, deren vorhandene <code>userId</code> sich vom eingehenden Duende-<code>sub</code> unterscheidet.
- Warnungen für unbekannte Tabellen und nicht zugeordnete Spalten, damit klar ist, was verworfen wird.

Vorschaupanel mit Zählern, Konflikten und Warnungen
Passwort-Hashes
Duende speichert Passwörter im ASP.NET-Identity-V3-Format (PBKDF2). Authagonals PasswordHasher verifiziert dieses Format direkt und rehasht bei der ersten erfolgreichen Anmeldung in das native Format — Benutzer behalten ihre bestehenden Passwörter ohne Reset-Flow.
Rotation der Owner-UserId
Wenn die E-Mail eines Mandanten-Admins in der Duende-Datenbank existiert, wird die Authagonal-userId des Admins an den Duende-sub angepasst. So bleiben Tokens und Audit-Einträge nach dem Cutover konsistent. Die Vorschau listet alle Konflikte auf, bevor Sie committen.
Sie werden möglicherweise abgemeldet
Import ausführen
Klicken Sie nach Prüfung der Vorschau auf Import starten. In der Commit-Phase werden Clients, Scopes, Benutzer, Rollen und externe Anmelde-Referenzen in Ihre Mandanten-Stores geschrieben. Doppelte clientId-, scope name-, email- und role name-Einträge werden übersprungen — der Importer ist mehrfach ausführbar.
Was nicht importiert wird
- Persisted Grants, Device Codes, Server-Side Sessions — kurzlebig, werden automatisch neu erzeugt.
- Signaturschlüssel — Authagonal gibt pro Mandant eigene Schlüssel aus.
- Eigene Spalten und Tabellen — alles außerhalb des Duende-Standardschemas wird als Warnung ausgegeben, damit klar ist, dass diese Daten verworfen werden.
- Deaktivierte Clients — werden deaktiviert importiert; bei Bedarf über die Seite Clients wieder aktivieren.
Nicht im Sandbox-Modus verfügbar
Import aus Auth0
Verbinden Sie Authagonal mit der Management API Ihres Auth0-Mandanten und übernehmen Sie Ihre Anwendungen, APIs, Rollen, Benutzer und Enterprise-Verbindungen. Importierte Benutzer- und Anwendungs-IDs bleiben erhalten, sodass bestehende sub- und client_id-Referenzen nach dem Umzug weiterhin aufgelöst werden.
Was Sie benötigen
Erstellen Sie in Auth0 eine Machine-to-Machine-Anwendung, die für die Management API autorisiert ist und über folgende Lese-Scopes verfügt: read:users, read:clients, read:resource_servers, read:roles, read:connections, read:client_grants. Tragen Sie deren Domain, Client-ID und Client-Secret in das Importformular ein — sie werden ausschließlich für den Import verwendet.
Was importiert wird
| Entität | Quelltabellen | Hinweise |
|---|---|---|
| Anwendungen | clients, client-grants | Public vs. confidential wird automatisch erkannt. Client-Secrets werden neu gehasht, damit sie weiter funktionieren. |
| APIs & Scopes | resource-servers | Audiences und Scopes werden jedem Client aus seinen Grants zugewiesen. |
| Rollen | roles + Zuweisungen | Pro-Benutzer-Rollenzuweisungen bleiben erhalten. |
| Benutzer | users + identities | Profile und Metadaten werden übertragen; Social-/Enterprise-Identitäten werden zu verknüpften Logins. |
| Verbindungen | connections (OIDC) | Enterprise-OIDC-Verbindungen werden zu föderierten Providern. SAML-, Social- und Datenbank-Verbindungen werden mit einer Warnung übersprungen. |
Passwörter
Die Management API von Auth0 gibt niemals Passwort-Hashes zurück. Wenn Sie über Auth0s support-gestützten Bulk-Passwortexport (NDJSON) verfügen, stellen Sie diesen bereit — bcrypt-Hashes werden unverändert importiert und Ihre Benutzer behalten ihre Passwörter ohne Reset. Diese Datei enthält außerdem Ihren vollständigen Benutzerbestand und hebt damit Auth0s Listenlimit von 1.000 Benutzern in der API auf. Ohne sie werden Benutzer als Profile importiert und legen beim ersten Login ein neues Passwort fest.
Gleiche Vorschau, Rotation und Limits
API-Referenz
Jeder Mandant stellt einen standardkonformen OIDC-Server unter https://{slug}.authagonal.io bereit. Alle Endpunkte folgen den OAuth 2.0- und OpenID Connect-Spezifikationen. Diese Referenz deckt jeden Endpunkt ab, mit dem Ihre Anwendung möglicherweise interagieren muss.
Authorization Code Flow mit PKCE
OIDC Discovery & JWKS
Das Discovery-Dokument ermöglicht es OIDC-Client-Bibliotheken, sich automatisch zu konfigurieren. Für keinen der beiden Endpunkte ist eine Authentifizierung erforderlich.
GET /.well-known/openid-configuration
Gibt das OpenID Provider Configuration-Dokument zurück. Die Antwort enthält alle Metadaten, die Ihr Client für die Interaktion mit diesem Mandanten benötigt.
| Feld | Beschreibung |
|---|---|
| issuer | Die Issuer-URL des Mandanten |
| authorization_endpoint | URL für Autorisierungsanfragen |
| token_endpoint | URL für den Token-Austausch |
| userinfo_endpoint | URL zum Abrufen von Benutzer-Claims |
| jwks_uri | URL für das JSON Web Key Set |
| revocation_endpoint | URL für Token-Widerruf |
| introspection_endpoint | URL für Token-Introspection |
| end_session_endpoint | URL für Logout / Sitzungsbeendigung |
| device_authorization_endpoint | URL für Geräteautorisierungsanfragen |
| pushed_authorization_request_endpoint | URL des Pushed Authorization Request-Endpunkts (RFC 9126). |
| require_pushed_authorization_requests | Ob der Mandant PAR global vorschreibt. Auch wenn dies <code>false</code> ist, können einzelne Clients <code>RequirePushedAuthorizationRequests = true</code> setzen. |
| scopes_supported | Liste der unterstützten Scopes |
| response_types_supported | Unterstützte Antworttypen |
| grant_types_supported | Unterstützte Grant-Typen |
| code_challenge_methods_supported | Unterstützte PKCE-Methoden (S256) |
| backchannel_logout_supported | Ob Back-Channel-Logout unterstützt wird |
GET /.well-known/openid-configuration/jwks
Gibt das JSON Web Key Set zurück, das zur Überprüfung von Token-Signaturen verwendet wird. Die Antwort enthält ein keys-Array mit öffentlichen RSA-Schlüsseln, die jeweils kty, use, kid, alg, n und e-Felder enthalten.
curl https://acme.authagonal.io/.well-known/openid-configuration
Autorisierungsendpunkt
GET /connect/authorize
Leitet einen Authorization-Code-Flow ein. Der Benutzer muss eine aktive Sitzung haben, andernfalls wird er zur Anmeldeseite weitergeleitet. Bei Erfolg wird der Benutzer mit einem Authorization Code zu Ihrer Anwendung zurückgeleitet.
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
response_type | Ja | Muss "code" sein |
client_id | Ja | Ihr registrierter Client-Bezeichner |
redirect_uri | Ja | Muss exakt mit einer registrierten Redirect-URI übereinstimmen |
scope | Ja | Leerzeichen-getrennte Liste von Scopes (z. B. "openid profile email") |
state | Empfohlen | Opaker Wert für CSRF-Schutz, wird unverändert in der Weiterleitung zurückgegeben |
code_challenge | Erforderlich bei PKCE | Base64url-kodierter SHA-256-Hash des code_verifier |
code_challenge_method | Erforderlich bei PKCE | Muss "S256" sein |
nonce | Optional | Wert, der an das ID-Token gebunden wird, zum Schutz vor Replay-Angriffen |
login_hint | Optional | Das E-Mail-Feld auf der Anmeldeseite vorausfüllen |
Erfolgsantwort: 302-Weiterleitung zu redirect_uri mit code- und state-Query-Parametern.
Fehlerantwort: 302-Weiterleitung mit error-, error_description- und state-Query-Parametern.
PKCE erforderlich
code_verifier (eine zufällige Zeichenkette mit 43 oder mehr Zeichen), hashen Sie ihn mit SHA-256 und kodieren Sie das Ergebnis in Base64url, um den code_challenge zu erstellen.Pushed Authorization Requests (PAR)
RFC 9126. Statt jeden Authorize-Parameter in die URL zu packen, sendet Ihr Client diese per POST an /connect/par mit normaler Client-Authentifizierung und erhält eine kurzlebige opake request_uri zurück. Der Browser ruft anschließend /connect/authorize?client_id=...&request_uri=... auf — sonst landet nichts in Browser-Historie, Server-Logs oder Referer-Headern, und der Server hat die Parameter unter Client-Authentifizierung bereits integritätsgeprüft.
POST /connect/par
Die Client-Authentifizierung ist identisch zu /connect/token: HTTP Basic mit client_id/client_secret oder formularkodierte Anmeldedaten. Public Clients senden ohne Secret. Der Body trägt dieselben Parameter, die Sie normalerweise an /connect/authorize schicken würden; request_uri selbst wird abgelehnt (das Verketten eines PAR ist laut §2.1 der Spezifikation verboten). Liefert 201 Created.
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
client_id | Ja | Ihre Client-ID. Muss mit dem authentifizierten Client übereinstimmen. |
client_secret | Vertrauliche Clients | Ihr Client-Secret. Erforderlich für vertrauliche Clients. |
response_type | Ja | Muss "code" sein |
redirect_uri | Ja | Muss exakt mit einer registrierten Redirect-URI übereinstimmen |
scope | Ja | Leerzeichen-getrennte Liste von Scopes (z. B. "openid profile email") |
code_challenge | Erforderlich bei PKCE | Base64url-kodierter SHA-256-Hash des code_verifier |
code_challenge_method | Erforderlich bei PKCE | Muss "S256" sein |
state | Empfohlen | Opaker Wert für CSRF-Schutz, wird unverändert in der Weiterleitung zurückgegeben |
nonce | Optional | Wert, der an das ID-Token gebunden wird, zum Schutz vor Replay-Angriffen |
Antwort
| Feld | Beschreibung |
|---|---|
request_uri | Einmalige opake Referenz, z. B. <code>urn:ietf:params:oauth:request_uri:abc123…</code>. Übergeben Sie sie als <code>request_uri</code> an <code>/connect/authorize</code>. |
expires_in | Lebensdauer der <code>request_uri</code> in Sekunden. Standard ist 90 — typischer Wert von Referenz-IdPs. |
Beim folgenden GET /connect/authorize?client_id=…&request_uri=… werden alle weiteren Parameter aus dem gepushten Payload gezogen; zusätzliche Query-Parameter werden ignoriert. Die client_id beim Authorize-Aufruf muss mit dem Client übereinstimmen, der den Request gepusht hat. Sobald sie konsumiert ist (oder expires_in abläuft), wird die request_uri aus dem Speicher entfernt.
PAR pro Client erzwingen
/connect/authorize-Aufrufe von ihm abzulehnen. Die empfohlene Konfiguration für hochsensible Clients kombiniert RequirePushedAuthorizationRequests = true mit PKCE — das eliminiert die URL-Leiste vollständig als Angriffsfläche.# 1. Push parameters (server returns request_uri + expires_in) curl -X POST https://acme.authagonal.io/connect/par \ -u "my-app:CLIENT_SECRET" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "response_type=code" \ -d "redirect_uri=https://app.example.com/callback" \ -d "scope=openid profile email" \ -d "state=$(openssl rand -hex 16)" \ -d "code_challenge=YOUR_CODE_CHALLENGE" \ -d "code_challenge_method=S256" # 2. Send the user to /authorize with only client_id + request_uri # https://acme.authagonal.io/connect/authorize?client_id=my-app&request_uri=urn:ietf:params:oauth:request_uri:abc123...
Token-Endpunkt
POST /connect/token
Tauscht Anmeldedaten gegen Tokens aus. Anfragen müssen Content-Type: application/x-www-form-urlencoded verwenden. Die Client-Authentifizierung kann über HTTP Basic Auth (Authorization: Basic base64(client_id:client_secret)) oder als Formular-Body-Parameter (client_id + client_secret) bereitgestellt werden.
Authorization Code Grant
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
grant_type | Ja | "authorization_code" |
code | Ja | Der Authorization Code aus der Weiterleitung |
redirect_uri | Ja | Muss mit der in der Autorisierungsanfrage verwendeten URI übereinstimmen |
code_verifier | Erforderlich bei PKCE | Die ursprüngliche Zufallszeichenkette, die zur Generierung des code_challenge verwendet wurde |
client_id | Ja | Ihr Client-Bezeichner (wenn nicht Basic Auth verwendet wird) |
client_secret | Vertrauliche Clients | Ihr Client-Secret (wenn nicht Basic Auth verwendet wird) |
Refresh Token Grant
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
grant_type | Ja | "refresh_token" |
refresh_token | Ja | Das auszutauschende Refresh-Token |
client_id | Ja | Ihr Client-Bezeichner |
client_secret | Vertrauliche Clients | Ihr Client-Secret |
Client Credentials Grant
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
grant_type | Ja | "client_credentials" |
client_id | Ja | Ihr Client-Bezeichner |
client_secret | Ja | Ihr Client-Secret |
scope | Optional | Leerzeichen-getrennte Scopes zum Anfordern |
Device Code Grant
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
grant_type | Ja | "urn:ietf:params:oauth:grant-type:device_code" |
device_code | Ja | Der Device Code aus der Geräteautorisierungsantwort |
client_id | Ja | Ihr Client-Bezeichner |
client_secret | Vertrauliche Clients | Ihr Client-Secret |
Token-Antwort:
| Feld | Beschreibung |
|---|---|
access_token | Das Access-Token für API-Aufrufe |
token_type | "Bearer" |
expires_in | Token-Lebensdauer in Sekunden |
id_token | OpenID Connect ID-Token (wenn der openid-Scope angefordert wird) |
refresh_token | Refresh-Token (wenn der offline_access-Scope gewährt wird) |
curl -X POST https://acme.authagonal.io/connect/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=authorization_code" \ -d "code=AUTHORIZATION_CODE" \ -d "redirect_uri=https://app.example.com/callback" \ -d "client_id=my-app" \ -d "code_verifier=YOUR_CODE_VERIFIER"
UserInfo-Endpunkt
GET /connect/userinfo
Gibt Claims über den authentifizierten Benutzer zurück. Erfordert ein gültiges Access-Token mit dem openid-Scope.
| Feld | Typ | Beschreibung |
|---|---|---|
sub | string | Eindeutiger Benutzerbezeichner |
email | string | E-Mail-Adresse des Benutzers |
email_verified | boolean | Ob die E-Mail verifiziert wurde |
given_name | string | Vorname |
family_name | string | Nachname |
name | string | Vollständiger Anzeigename |
phone_number | string | Telefonnummer (falls angegeben) |
org_id | string | Organisationsbezeichner |
roles | string[] | Array der zugewiesenen Rollen |
groups | object[] | Array der Gruppenmitgliedschaften, jeweils mit id und name |
curl https://acme.authagonal.io/connect/userinfo \ -H "Authorization: Bearer ACCESS_TOKEN"
Token Introspection (RFC 7662)
POST /connect/introspect
Validiert ein Token und gibt seine Metadaten zurück. Erfordert Client-Anmeldedaten (Basic Auth oder Formular-Body-Parameter).
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
token | Ja | Das zu untersuchende Token |
token_type_hint | Optional | Hinweis auf den Token-Typ (z. B. "refresh_token") |
Antwort für aktives Token:
| Feld | Beschreibung |
|---|---|
active | true |
sub | Subjekt (Benutzer-ID) |
client_id | Client, für den das Token ausgestellt wurde |
scope | Leerzeichen-getrennte gewährte Scopes |
iss | Aussteller |
exp | Ablaufzeit (Unix-Zeitstempel) |
iat | Ausstellungszeit (Unix-Zeitstempel) |
aud | Zielgruppe |
token_type | Token-Typ (z. B. "Bearer") |
Antwort für inaktives Token: { "active": false }
Immer 200 OK
active: false zurück.curl -X POST https://acme.authagonal.io/connect/introspect \ -u "my-app:CLIENT_SECRET" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "token=ACCESS_OR_REFRESH_TOKEN"
Token-Widerruf (RFC 7009)
POST /connect/revocation
Widerruft ein zuvor ausgestelltes Token. Erfordert Client-Anmeldedaten.
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
token | Ja | Das zu widerrufende Token |
token_type_hint | Optional | Hinweis auf den Token-Typ (z. B. "refresh_token") |
Der Endpunkt gibt gemäß der RFC 7009-Spezifikation immer 200 OK zurück, auch für ungültige oder bereits widerrufene Tokens.
Nur Refresh-Tokens
Geräteautorisierung (RFC 8628)
POST /connect/deviceauthorization
Leitet den Geräteautorisierungsflow für eingabebeschränkte Geräte ein (CLIs, Smart-TVs, IoT-Geräte). Das Gerät zeigt dem Benutzer einen Code an, der die Anfrage dann auf einem separaten Gerät mit Browser genehmigt.
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
client_id | Ja | Ihr Client-Bezeichner |
client_secret | Vertrauliche Clients | Ihr Client-Secret |
scope | Optional | Leerzeichen-getrennte Scopes (Standard: "openid") |
Antwort:
| Feld | Beschreibung |
|---|---|
device_code | Geräte-Verifizierungscode (für Polling verwendet) |
user_code | Benutzercode im Format XXXX-XXXX |
verification_uri | URL, die der Benutzer besucht, um den Code einzugeben |
verification_uri_complete | URL mit vorausgefülltem user_code |
expires_in | 600 (Sekunden — der Code ist 10 Minuten gültig) |
interval | 5 (Sekunden — minimales Polling-Intervall) |
Genehmigungsablauf: Der Benutzer besucht die verification_uri, gibt den user_code ein und genehmigt die Anfrage. Währenddessen pollt das Gerät den Token-Endpunkt mit dem device_code.
Polling-Fehlercodes:
| Fehler | Bedeutung |
|---|---|
authorization_pending | Der Benutzer hat noch nicht genehmigt — weiter pollen |
expired_token | Der Device Code ist abgelaufen — Flow neu starten |
access_denied | Der Benutzer hat die Autorisierungsanfrage abgelehnt |
curl -X POST https://acme.authagonal.io/connect/deviceauthorization \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id=my-cli" \ -d "scope=openid profile email"
Sitzung beenden / Logout
GET POST /connect/endsession
Meldet die aktuelle Benutzersitzung ab, löst Back-Channel-Logout für alle Clients mit registrierter BackChannelLogoutUri aus und widerruft alle Grants.
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
id_token_hint | Optional | Das ID-Token — wird zur Validierung der post_logout_redirect_uri verwendet |
post_logout_redirect_uri | Optional | Wohin nach dem Logout weitergeleitet wird (muss registriert sein) |
state | Optional | Opaker Wert, der in der Weiterleitung zurückgegeben wird |
Wenn eine gültige post_logout_redirect_uri angegeben wird und mit einer registrierten URI übereinstimmt, erhält der Benutzer eine 302-Weiterleitung. Andernfalls bestätigt eine JSON-Antwort, dass die Sitzung beendet wurde.
Back-Channel-Logout
BackChannelLogoutUri jedes Clients. Das JWT enthält sub, aud, iss und den http://schemas.openid.net/event/backchannel-logout-Event-Claim. Ihre Anwendung sollte die lokale Sitzung des Benutzers ungültig machen, wenn sie diese Benachrichtigung erhält.SCIM 2.0 API-Referenz
Authagonal unterstützt das SCIM 2.0-Protokoll für die automatisierte Benutzer- und Gruppenbereitstellung. Identity Provider wie Okta, Azure AD und OneLogin können diese API verwenden, um Ihren Authagonal-Mandanten mit Ihrem Unternehmensverzeichnis synchron zu halten.
Basis-URL: https://{slug}.authagonal.io/scim/v2
Authentifizierung: Alle Anfragen erfordern ein Bearer-Token. Generieren Sie ein SCIM-Token im Portal unter Einstellungen > SCIM-Bereitstellung.
Allgemeine Header:
| Header | Wert |
|---|---|
Authorization | Bearer SCIM_TOKEN |
Content-Type | application/scim+json |
Listen-Endpunkte unterstützen Paginierung über die Query-Parameter startIndex (1-basiert) und count (max. 200) sowie Filterung über den filter-Parameter (z. B. userName eq "user@example.com").
Benutzer
GET /scim/v2/Users — Benutzer mit optionaler Paginierung und Filterung auflisten.
| Query-Parameter | Beschreibung |
|---|---|
startIndex | 1-basierter Index des ersten Ergebnisses (Standard: 1) |
count | Maximale Anzahl von Ergebnissen pro Seite (max.: 200) |
filter | SCIM-Filterausdruck (z. B. userName eq "user@example.com") |
GET /scim/v2/Users/{id} — Einen einzelnen Benutzer anhand seiner Authagonal-Benutzer-ID abrufen.
POST /scim/v2/Users — Einen neuen Benutzer erstellen. Gibt 201 Created zurück.
| Feld | Erforderlich | Beschreibung |
|---|---|---|
userName | Ja | E-Mail-Adresse (muss innerhalb des Mandanten eindeutig sein) |
name.givenName | Nein | Vorname |
name.familyName | Nein | Nachname |
displayName | Nein | Vollständiger Anzeigename |
active | Nein | Ob der Benutzer aktiv ist (Standard: true) |
externalId | Nein | Bezeichner vom vorgelagerten Identity Provider |
PUT /scim/v2/Users/{id} — Vollständiger Ersatz einer Benutzerressource. Alle Felder müssen angegeben werden.
PATCH /scim/v2/Users/{id} — Teilweise Aktualisierung mittels SCIM PatchOp.
| Operation | Unterstützte Pfade | Beispielwert |
|---|---|---|
replace | active, name.givenName, name.familyName, externalId | true / false oder ein Zeichenkettenwert |
add | name.givenName, name.familyName, externalId | Ein Zeichenkettenwert |
remove | externalId | (kein Wert erforderlich) |
DELETE /scim/v2/Users/{id} — Löscht den Benutzer vorläufig (deaktiviert das Konto und widerruft alle Tokens). Gibt 204 No Content zurück.
curl -X POST https://acme.authagonal.io/scim/v2/Users \
-H "Authorization: Bearer SCIM_TOKEN" \
-H "Content-Type: application/scim+json" \
-d '{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "jane@acme.com",
"name": {
"givenName": "Jane",
"familyName": "Smith"
},
"displayName": "Jane Smith",
"active": true,
"externalId": "ext-12345"
}'Gruppen
GET /scim/v2/Groups — Alle Gruppen mit optionaler Paginierung und Filterung auflisten.
GET /scim/v2/Groups/{id} — Eine einzelne Gruppe anhand der ID abrufen, einschließlich ihrer Mitgliederliste.
POST /scim/v2/Groups — Eine neue Gruppe erstellen. Gibt 201 Created zurück.
| Feld | Erforderlich | Beschreibung |
|---|---|---|
displayName | Ja | Anzeigename der Gruppe |
members | Nein | Array von Mitgliedsobjekten, jeweils mit einem value-Feld, das die Benutzer-ID enthält |
externalId | Nein | Bezeichner vom vorgelagerten Identity Provider |
PUT /scim/v2/Groups/{id} — Vollständiger Ersatz einer Gruppenressource (einschließlich ihrer Mitgliederliste).
PATCH /scim/v2/Groups/{id} — Teilweise Aktualisierung zum Hinzufügen oder Entfernen von Gruppenmitgliedern.
DELETE /scim/v2/Groups/{id} — Löscht die Gruppe endgültig. Gibt 204 No Content zurück.
curl -X PATCH https://acme.authagonal.io/scim/v2/Groups/GROUP_ID \
-H "Authorization: Bearer SCIM_TOKEN" \
-H "Content-Type: application/scim+json" \
-d '{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "add",
"path": "members",
"value": [
{ "value": "USER_ID_1" },
{ "value": "USER_ID_2" }
]
}
]
}'SCIM-Fehlerantworten
{ "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"], "status": "400", "detail": "..." }. Häufige Statuscodes sind 400 (ungültige Anfrage), 404 (Ressource nicht gefunden), 409 (Konflikt / Duplikat) und 429 (Rate limitiert).Portal API (Automatisierung)
Mit der Portal API kann Ihr eigenes Backend alles automatisieren, was Sie im Portal tun können — Benutzer, Clients, Gruppen, Rollen, Scopes, SSO-Verbindungen und Einstellungen verwalten — über eine Machine-to-Machine-Berechtigung. Es ist dieselbe API, die auch die Portal-Oberfläche aufruft.
Basis-URL: https://portal-api.<your-domain>/api/v1. Anfragen authentifizieren sich mit einem Bearer-Access-Token; der Mandant wird dem Token entnommen, nicht der URL.
API-Zugangsdaten erstellen
Öffnen Sie im Portal Clients → Create API credential, wählen Sie eine Zugriffsebene und vergeben Sie einen Namen. Authagonal erzeugt einen für die Portal API konfigurierten OAuth-client_credentials-Client und gibt eine Client-ID und ein Secret zurück.
Kopieren Sie das Secret sofort
Zugriffsebenen
| Scope | Berechtigungen |
|---|---|
tenant:owner | Vollzugriff, einschließlich destruktiver, ausschließlich dem Owner vorbehaltener Aktionen wie das Löschen des gesamten Mandanten. |
tenant:admin | Alles verwalten außer Owner-exklusiven Aktionen — Benutzer, Clients, SSO, Gruppen, Rollen, Branding und Einstellungen. |
tenant:developer | Clients, Scopes und Bereitstellungs-Apps verwalten. |
tenant:support | Benutzer für Support-Aufgaben lesen und verwalten. |
Sie können nur gewähren, was Sie selbst besitzen
Token abrufen
Tauschen Sie die Zugangsdaten am Token-Endpunkt Ihres Admin-Mandanten gegen ein Access-Token — https://<your-tenant>.<your-domain>/connect/token — und senden Sie das Token anschließend als Bearer-Header an die Portal API. Tokens sind eine Stunde lang gültig.
# 1. Exchange the credential for an access token (your tenant's token endpoint)
curl -X POST https://acme.authagonal.io/connect/token \
-d grant_type=client_credentials \
-d client_id=api-3f2a... \
-d client_secret=YOUR_CLIENT_SECRET \
-d scope=tenant:admin
# Response: { "access_token": "ey...", "token_type": "Bearer", "expires_in": 3600 }
# 2. Call the Portal API with the access token
curl https://portal-api.authagonal.io/api/v1/users \
-H "Authorization: Bearer $ACCESS_TOKEN"Endpunkte
Alle Pfade sind relativ zur Basis-URL und erfordern ein Bearer-Zugriffstoken. Der Scope neben jeder Gruppe ist die minimale Zugriffsebene, die die Anmeldedaten benötigen. List-Endpunkte akzeptieren die Query-Parameter startIndex und count.
tenant:developerGET/api/v1/clients— OAuth-Clients auflisten.
GET/api/v1/clients/{id}— Einen einzelnen Client per ID abrufen.
POST/api/v1/clients— Einen Client erstellen. Gibt die Client-ID zurück und, bei vertraulichen Clients, ein einmaliges Secret.
PUT/api/v1/clients/{id}— Einen Client aktualisieren (Redirect-URIs, Grant-Typen, Token-Lebensdauern, PKCE/PAR-Anforderungen).
DELETE/api/v1/clients/{id}— Einen Client löschen.
POST/api/v1/clients/api-credential— Eine Machine-to-Machine-Anmeldeinformation für die Portal-API erstellen.
tenant:supportGET/api/v1/users— Benutzer auflisten. Unterstützt startIndex, count und search (E-Mail-/Namenspräfix).
GET/api/v1/users/count— Gesamtzahl der Benutzer des Mandanten.
GET/api/v1/users/stats/mfa— Statistik zur MFA-Registrierung.
GET/api/v1/users/{id}— Einen einzelnen Benutzer abrufen.
POST/api/v1/users— Einen Benutzer mit E-Mail und Passwort erstellen.
PUT/api/v1/users/{id}— Einen Benutzer aktualisieren (Profil, E-Mail, aktiviert/gesperrt).
DELETE/api/v1/users/{id}— Einen Benutzer löschen.
GET/api/v1/users/{id}/mfa— Get a user's enrolled MFA methods.
DELETE/api/v1/users/{id}/mfa— Reset a user's MFA enrollment.
tenant:adminGET/api/v1/roles— Rollen auflisten.
POST/api/v1/roles— Eine Rolle erstellen.
DELETE/api/v1/roles/{id}— Eine Rolle löschen.
POST/api/v1/roles/assign— Einem Benutzer eine Rolle zuweisen.
POST/api/v1/roles/unassign— Einem Benutzer eine Rolle entziehen.
tenant:adminGET/api/v1/groups— Gruppen auflisten.
GET/api/v1/groups/{id}— Eine Gruppe mit ihren Mitgliedern abrufen.
POST/api/v1/groups— Eine Gruppe erstellen.
POST/api/v1/groups/{id}/members— Mitglieder zu einer Gruppe hinzufügen.
DELETE/api/v1/groups/{groupId}/members/{userId}— Ein Mitglied aus einer Gruppe entfernen.
DELETE/api/v1/groups/{id}— Eine Gruppe löschen.
GET/api/v1/group-role-mappings— Gruppen-zu-Rollen-Zuordnungen auflisten (Rollen, die bei der Token-Ausstellung über die Gruppenmitgliedschaft gewährt werden).
tenant:developerGET/api/v1/scopes— API-Scopes auflisten.
POST/api/v1/scopes— Einen Scope erstellen.
DELETE/api/v1/scopes/{name}— Einen Scope löschen.
tenant:adminGET/api/v1/saml/connections— SAML-Verbindungen auflisten.
POST/api/v1/saml/connections— Eine SAML-Verbindung erstellen.
DELETE/api/v1/saml/connections/{id}— Eine SAML-Verbindung löschen.
GET/api/v1/oidc/connections— OIDC-Verbindungen auflisten.
POST/api/v1/oidc/connections— Eine OIDC-Verbindung erstellen.
DELETE/api/v1/oidc/connections/{id}— Eine OIDC-Verbindung löschen.
GET/api/v1/sso/domains— Die Domains auflisten, die an SSO-Verbindungen geleitet werden (Home-Realm-Discovery).
tenant:adminGET/api/v1/branding— Das Mandanten-Branding abrufen (Farben, Logo, unterstützte Sprachen).
PUT/api/v1/branding— Das Mandanten-Branding aktualisieren.
tenant:adminGET/api/v1/settings— Mandanteneinstellungen abrufen (Webhooks, öffentliche Registrierung, Token-Richtlinie).
PUT/api/v1/settings— Mandanteneinstellungen aktualisieren.
POST/api/v1/settings/webhook-secret/regenerate— Das Webhook-Signatur-Secret rotieren.
POST/api/v1/settings/test-email— Eine Test-E-Mail mit der aktuellen E-Mail-Konfiguration senden.
tenant:adminGET/api/v1/custom-domains— Eigene Login-Domains und deren Verifizierungsstatus auflisten.
POST/api/v1/custom-domains— Eine eigene Domain hinzufügen.
POST/api/v1/custom-domains/{domain}/verify— DNS-Verifizierung für eine eigene Domain auslösen.
DELETE/api/v1/custom-domains/{domain}— Eine eigene Domain entfernen.
GET/api/v1/email/domains— Absender-E-Mail-Domains auflisten.
tenant:adminGET/api/v1/audit— Das Audit-Log des Mandanten abfragen.
Benutzer per SCIM bereitstellen
Beispiel: Benutzer erstellen
curl -X POST https://portal-api.authagonal.io/api/v1/users \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "ada@acme.com",
"password": "S3cure-temp-passw0rd",
"firstName": "Ada",
"lastName": "Lovelace"
}'
# 200 OK
# { "userId": "8f3a...", "email": "ada@acme.com" }Alles, was die Oberfläche kann
Authentifizierungsabläufe
Authentifizierungsabläufe beschreiben, wie Endbenutzer mit Ihrem Authagonal-Mandanten interagieren — Anmeldung, Registrierung, Passwortzurücksetzung und MFA-Einrichtung. Diese Endpunkte werden von der gehosteten Anmeldeseite verwendet und können direkt aufgerufen werden, wenn Sie eine benutzerdefinierte Anmeldeoberfläche erstellen.
Anmeldung
POST /api/auth/login
Authentifiziert einen Benutzer mit E-Mail und Passwort. Bei Erfolg wird ein Sitzungs-Cookie signiert und das Benutzerprofil zurückgegeben. Wenn MFA konfiguriert ist, zeigt die Antwort an, dass ein zweiter Faktor erforderlich ist, bevor die Sitzung vollständig hergestellt wird.
Anfragekörper:
{
"email": "user@example.com",
"password": "correct-horse-battery-staple"
}Erfolgsantwort:
| Feld | Typ | Beschreibung |
|---|---|---|
userId | string | Eindeutiger Benutzerbezeichner |
email | string | E-Mail-Adresse des Benutzers |
name | string | Vollständiger Anzeigename |
mfaAvailable | boolean | Ob der Benutzer MFA-Methoden registriert hat |
MFA-erforderlich-Antwort: Wenn der Benutzer MFA registriert hat, enthält die Antwort mfaRequired: true zusammen mit einer challengeId und einem methods-Array mit verfügbaren MFA-Methoden.
MFA-Einrichtung-erforderlich-Antwort: Wenn der Mandant MFA erfordert, der Benutzer sich aber noch nicht registriert hat, enthält die Antwort mfaSetupRequired: true mit einem setupToken für den Registrierungsablauf.
Fehlerantworten:
| Fehlercode | HTTP-Status | Beschreibung |
|---|---|---|
invalid_credentials | 401 | E-Mail oder Passwort ist falsch |
account_disabled | 403 | Das Konto wurde von einem Administrator deaktiviert |
email_not_confirmed | 403 | Der Benutzer hat seine E-Mail-Adresse nicht verifiziert |
locked_out | 423 | Konto ist vorübergehend gesperrt (enthält retryAfter in Sekunden) |
sso_required | 409 | E-Mail-Domain hat SSO konfiguriert (enthält redirectUrl) |
SSO-Prüfung: Wenn die E-Mail-Domain des Benutzers eine SSO-Verbindung konfiguriert hat, gibt der Anmeldeendpunkt sso_required mit einer redirectUrl zurück. Der Client sollte den Benutzer zum SSO-Anbieter weiterleiten.
Kontosperrung: Nach maxFailedAttempts aufeinanderfolgenden fehlgeschlagenen Anmeldeversuchen wird das Konto für lockoutDurationMinutes gesperrt. Beide Werte sind in den Mandanteneinstellungen konfigurierbar.
Gehostete Anmeldeseite
Registrierung
POST /api/auth/register
Erstellt ein neues Benutzerkonto. Eine Bestätigungs-E-Mail wird automatisch gesendet — der Benutzer muss seine E-Mail verifizieren, bevor er sich anmelden kann.
Anfragekörper:
{
"email": "newuser@example.com",
"password": "a-strong-password-here",
"firstName": "Jane",
"lastName": "Smith"
}| Feld | Erforderlich | Beschreibung |
|---|---|---|
email | Ja | E-Mail-Adresse (muss eindeutig sein) |
password | Ja | Muss der Passwortrichtlinie des Mandanten entsprechen |
firstName | Nein | Vorname |
lastName | Nein | Nachname |
Erfolg: 201 Created mit der userId des neuen Kontos.
Fehlerantworten:
| Fehlercode | HTTP-Status | Beschreibung |
|---|---|---|
email_already_registered | 409 | Ein Konto mit dieser E-Mail-Adresse existiert bereits |
weak_password | 400 | Passwort entspricht nicht der Passwortrichtlinie des Mandanten |
rate_limited | 429 | Zu viele Registrierungsversuche |
provisioning_rejected | 422 | Ein Bereitstellungs-Webhook hat die Registrierung abgelehnt |
Passwortrichtlinie
/api/auth/password-policy. Dies gibt die Mindestlänge, erforderliche Zeichenklassen und ob die Prüfung auf kompromittierte Passwörter aktiviert ist zurück.Passwortzurücksetzung
POST /api/auth/forgot-password
Fordert eine E-Mail zur Passwortzurücksetzung an. Der Endpunkt gibt immer eine Erfolgsantwort zurück, unabhängig davon, ob die E-Mail existiert, um E-Mail-Enumeration zu verhindern.
{
"email": "user@example.com"
}POST /api/auth/reset-password
Setzt das Passwort des Benutzers mit dem Token aus dem E-Mail-Link zurück.
{
"token": "RESET_TOKEN_FROM_EMAIL",
"newPassword": "new-strong-password"
}Nebeneffekte einer erfolgreichen Passwortzurücksetzung:
- Zähler für fehlgeschlagene Anmeldeversuche wird auf null zurückgesetzt
- Alle bestehenden Refresh-Tokens werden widerrufen
- Ein neuer Sicherheitsstempel wird generiert (alle bestehenden Sitzungen werden ungültig)
MFA-Einrichtung & -Verifizierung
Authagonal unterstützt drei MFA-Methoden: TOTP (Authenticator-Apps), WebAuthn (Sicherheitsschlüssel und Biometrie) und Einmal-Wiederherstellungscodes.
TOTP-Einrichtung
POST /api/auth/mfa/totp/setup — Gibt eine QR-Code-Daten-URI und einen manuellen Eingabeschlüssel zurück. Der Benutzer scannt den QR-Code mit seiner Authenticator-App (Google Authenticator, Authy, 1Password usw.) und bestätigt dann die Registrierung.
POST /api/auth/mfa/totp/confirm — Bestätigt die TOTP-Registrierung durch Validierung eines 6-stelligen Codes aus der Authenticator-App.
{
"code": "123456"
}WebAuthn-Einrichtung
POST /api/auth/mfa/webauthn/setup — Gibt Optionen zur Credential-Erstellung für die WebAuthn-API zurück. Der Browser ruft navigator.credentials.create() mit diesen Optionen auf.
POST /api/auth/mfa/webauthn/confirm — Bestätigt die WebAuthn-Registrierung durch Übermittlung der Attestierungsantwort des Browsers.
Wiederherstellungscodes
POST /api/auth/mfa/recovery/generate — Generiert 10 einmalig verwendbare 8-Zeichen-Wiederherstellungscodes. Jeder Code kann genau einmal verwendet werden, um MFA zu umgehen.
Wiederherstellungscodes werden nur einmal angezeigt
MFA-Verifizierung
POST /api/auth/mfa/verify — Schließt die MFA-Challenge nach einer erfolgreichen Passwort-Anmeldung ab.
| Feld | Erforderlich | Beschreibung |
|---|---|---|
challengeId | Ja | Die Challenge-ID aus der Anmeldeantwort |
method | Ja | "totp", "recovery" oder "webauthn" |
code | TOTP / Wiederherstellung | 6-stelliger TOTP-Code oder 8-Zeichen-Wiederherstellungscode |
assertion | WebAuthn | Die Assertion-Antwort von navigator.credentials.get() |
MFA-Status
GET /api/auth/mfa/status — Gibt die aktuell registrierten MFA-Methoden des Benutzers zurück.
SSO-Anmeldeablauf
Authagonal unterstützt sowohl SAML 2.0- als auch OIDC-basierte SSO-Verbindungen. Domänbasiertes Routing erkennt automatisch, welcher SSO-Anbieter basierend auf der E-Mail-Adresse des Benutzers verwendet werden soll.
SSO-Prüfung
GET /api/auth/sso-check?email=user@acme.com
| Feld | Typ | Beschreibung |
|---|---|---|
ssoRequired | boolean | Ob die E-Mail-Domain SSO erfordert |
providerType | string | "saml" oder "oidc" |
connectionId | string | Der SSO-Verbindungsbezeichner |
redirectUrl | string | Die URL, zu der der Benutzer für die SSO-Anmeldung weitergeleitet wird |
SAML-Flow
Der Benutzer wird zu GET /saml/{connectionId}/login weitergeleitet, das einen SAML AuthnRequest an den Identity Provider sendet. Der IdP authentifiziert den Benutzer und sendet eine SAML-Antwort an den Assertion Consumer Service (ACS)-Endpunkt zurück. Authagonal validiert die Assertion, erstellt oder aktualisiert den Benutzer und signiert ein Sitzungs-Cookie.
SAML-Metadaten zur Konfiguration Ihres IdP sind verfügbar unter GET /saml/{connectionId}/metadata.
OIDC-Flow
Der Benutzer wird zu GET /oidc/{connectionId}/login weitergeleitet, das zum vorgelagerten Identity Provider mit PKCE weiterleitet. Nachdem sich der Benutzer authentifiziert hat, tauscht der Callback unter /oidc/callback den Authorization Code aus, validiert das ID-Token und erstellt oder aktualisiert den Benutzer.
JIT-Bereitstellung: Sowohl SAML- als auch OIDC-Flows unterstützen Just-in-Time-Bereitstellung. Wenn der Benutzer noch nicht im Mandanten existiert, wird er automatisch aus den Claims des Identity Providers erstellt. Wenn er bereits existiert, werden seine Profilattribute aktualisiert, um mit den neuesten Werten des Providers übereinzustimmen.
Domänbasiertes Routing
Eine eigene Login-Oberfläche erstellen
Ersetzen Sie die von Authagonal gehosteten Anmelde-, Registrierungs-, Passwort-Reset- und MFA-Bildschirme durch Ihre eigene Oberfläche, während Authagonal weiterhin Authentifizierung, MFA, SSO, Sitzungen und Token-Ausstellung übernimmt. Zwei Wege: Nutzen Sie unsere React-Komponentenbibliothek oder rufen Sie die Auth-API direkt aus einem beliebigen Framework auf. Es ist optional — aktivieren Sie zuerst Custom login UI in den Mandanteneinstellungen.
Voraussetzung: eine eigene Domain auf Ihrer Root-Domain
Die Login-Sitzung ist ein First-Party-Cookie, daher müssen sich Ihre Oberfläche und der Authagonal-Auth-Server eine registrierbare Domain teilen. Richten Sie eine eigene Auth-Domain bei Authagonal auf derselben Root-Domain ein, auf der Ihre App läuft — z. B. Auth unter login.acme.com, App unter app.acme.com. Die Einstellung Custom login UI bleibt deaktiviert, bis eine aktive eigene Domain existiert.
| Ihre Oberfläche | Auth-Host | Funktioniert? |
|---|---|---|
| app.acme.com | login.acme.com | ✅ gleiche Root-Domain |
| acme.com | auth.acme.com | ✅ gleiche Root-Domain |
| app.acme.com | acme.authagonal.io | ❌ Cross-Site |
| myapp.io | login.acme.com | ❌ Cross-Site |
Warum eine eigene Domain erforderlich ist
Fügen Sie außerdem den Origin Ihrer Oberfläche (z. B. https://app.acme.com) zu den Allowed CORS origins Ihres OAuth-Clients hinzu — dieselbe Liste, die Sie für den Token-Austausch festlegen.
React: @authagonal/login
npm i @authagonal/login liefert die Auth-Logik und die UI als ein Paket — dasselbe, auf dem die von Authagonal gehostete Anmeldung basiert. Wählen Sie Ihre Abstraktionsebene:
- Vollständige App — binden Sie
Appein und gestalten Sie sie per Branding. - Seiten zusammenstellen — verwenden Sie
LoginPage,MfaChallengePage,ResetPasswordPage… in Ihrem eigenen Layout. - Primitive + Logik — erstellen Sie eigene Bildschirme mit
AuthLayout/Button/Inputund dem API-Client (login,mfaVerify,forgotPassword, …).
import { AuthLayout, Input, Button, login, ApiRequestError } from '@authagonal/login';
function MyLogin() {
async function onSubmit(email: string, password: string) {
try {
const res = await login({ email, password }); // POST /login (sets the session cookie)
if (res.mfaRequired) {/* render your MFA step → mfaVerify(...) */}
else window.location.href = res.returnUrl; // hand off to /connect/authorize
} catch (e) {
if (e instanceof ApiRequestError) {/* show e.message */}
}
}
return <AuthLayout>{/* your own markup + <Input/> <Button/> */}</AuthLayout>;
}Beliebiges Framework: die Auth-API aufrufen
Nicht auf React? Rufen Sie die Auth-Flow-Endpunkte direkt auf (unter /api/auth) und übergeben Sie dann an den standardmäßigen OIDC-/connect/authorize-Flow. Senden Sie credentials: 'include', damit das Sitzungscookie gespeichert wird.
| Endpunkt | Zweck |
|---|---|
POST /api/auth/login | Authentifizieren; gibt mfaRequired oder eine Return-URL zurück |
POST /api/auth/register | Selbstregistrierung (wenn aktiviert) |
POST /api/auth/forgot-password | Eine Passwortzurücksetzung starten |
POST /api/auth/reset-password | Eine Passwortzurücksetzung abschließen |
GET /api/auth/password-policy | Passwortrichtlinie (zum Anzeigen der Regeln) |
POST /api/auth/mfa/* | MFA-Einrichtung + Verifizierung (TOTP, WebAuthn, Wiederherstellung) |
credentials: 'include' verwenden
# 1. Authenticate (browser fetch — credentials:'include' so the session cookie is stored)
curl -i -X POST https://login.acme.com/api/auth/login \
-H "Content-Type: application/json" \
-H "Origin: https://app.acme.com" \
--data '{"email":"jane@acme.com","password":"..."}'
# (handle {"mfaRequired":true} → POST /api/auth/mfa/verify, then continue)
# 2. Hand off to the OAuth flow — top-level navigation to the authorize endpoint with PKCE:
# https://login.acme.com/connect/authorize?client_id=my-app&redirect_uri=...&response_type=code
# &scope=openid%20profile%20email&code_challenge=...&code_challenge_method=S256
# The session cookie (same-site) authenticates the user; you get back a code → exchange at /connect/token.Tarife & Limits
Authagonal bietet vier Tarifstufen. Alle Tarife beinhalten alle Funktionen -- der einzige Unterschied ist das Limit für monatlich aktive Benutzer (MAU) und die Überschreitungspreise.
Tarifstufen
| Tarif | MAU-Limit | Überschreitung | Überschreitungskosten/Benutzer |
|---|---|---|---|
| Starter | 1,000 | Nein | — |
| Pro | 5.000 | Ja | $0,04/Benutzer |
| Scale | 25.000 | Ja | $0,025/Benutzer |
| Enterprise | 100.000 | Ja | $0,015/Benutzer |
Monatlich aktive Benutzer (MAU)
Ein monatlich aktiver Benutzer ist jeder eindeutige Benutzer, der sich mindestens einmal während eines Abrechnungsmonats erfolgreich authentifiziert. Über SCIM bereitgestellte Benutzer, die sich nicht angemeldet haben, zählen nicht zu Ihrer MAU-Gesamtzahl.
Überschreitung -- Wenn Ihr Tarif Überschreitungen unterstützt, werden Benutzer über dem MAU-Limit zum in der Tariftabelle oben angegebenen Preis pro Benutzer abgerechnet. Sie können eine Überschreitungsobergrenze festlegen, um Ihre maximalen Ausgaben für den Abrechnungszeitraum zu begrenzen.
Durchsetzung -- Wenn Ihr Tarif keine Überschreitung unterstützt (Starter), können sich Benutzer über dem MAU-Limit nicht anmelden, bis der nächste Abrechnungszeitraum beginnt oder Sie auf einen Tarif mit Überschreitungsunterstützung upgraden.
Vollständiger Funktionsumfang in jedem Tarif