1 / 16

Authentifizierung & Nutzerverwaltung

Ein Login für Ihre
ganze Produktlandschaft

fx-auth ist der Authentifizierungs-Server, den Sie einmal aufsetzen und in jeder Anwendung wiederverwenden: zehn Anmeldewege, ein signiertes Token, ein Rechtemodell — und Ihre Nutzer:innen bleiben, wo sie heute schon sind.

FreshX GmbH · freshx.de/fx-auth Rust · Axum · WebAuthn · OpenID Connect · OAuth2

Ausgangslage

Jede neue Anwendung bringt ihr eigenes Login mit

Und damit ihre eigene Nutzertabelle, ihre eigenen Passwortregeln — und ihre eigene Lücke.

🔁 Dreimal dasselbe gebaut

Login, Registrierung, Passwort-Reset, E-Mail-Versand, 2FA: in jedem Projekt neu implementiert, jedes Mal ein wenig anders — und jedes Mal neu zu prüfen. Ihr Team pflegt Anmeldeformulare statt Ihres Produkts.

🗂 Identitäten in vier Silos

Beschäftigte im Active Directory, Kundschaft in der Produktdatenbank, Partnerfirmen mit Google-Konto, Maschinen mit hartcodierten Tokens. Niemand kann verlässlich sagen, wer heute auf was Zugriff hat.

🧱 Nachrüsten ist ein Projekt

Zwei-Faktor-Pflicht, Passkeys, „Anmelden mit Microsoft", ein Rechtemodell, das ein Audit akzeptiert: genau die Dinge, die am Ende verlangt werden — und die im Nachhinein teuer sind.

Die Folge: das Sicherheitsniveau ist je Anwendung unterschiedlich, es gibt keinen gemeinsamen Rechte-Überblick, und ein neues Produkt startet nicht mit Ihrer Fachlogik, sondern mit dem Login.

Die Lösung im Überblick

Ein Server zwischen Ihren Identitätsquellen und Ihren Anwendungen

IDENTITÄTSQUELLEN · WO IHRE KONTEN SCHON SIND IHRE ANWENDUNGEN PostgreSQL SQLite LDAP / Active Directory OpenID Connect Zertifikat-Login Ihr eigenes Plugin fx-auth Signiertes JWT Browser-Anwendungen Ihre eigenen APIs Desktop & Mobile Fremd-Anwendungen Speicher-Backend Speicher-Backend, dateibasiert Unternehmens-Verzeichnis Google · Azure AD · Keycloak QR-Code + Authenticator-App Altsystem · eigene DB · eigene API Rust · Axum · eine Binary HttpOnly-Cookie · Web-Component <fx-auth> Rust · Node · jede Sprache Tauri-Plugin, native Passkeys OAuth2 Authorization Code + PKCE stellt aus lokal geprüft ES256 / RS256 Prüfschlüssel öffentlich: /.well-known/jwks.json · Anmeldung, MFA, Passkeys · Sessions & Refresh-Rotation · Rechte, Rollen, Gruppen · OAuth2-Provider für Fremd-Apps · Nutzerverwaltung & Profile · Fertige Login-UI, mehrsprachig 94 Endpunkte, OpenAPI-dokumentiert Rechte-Engine: control · target · access_type austauschbare Backend-Plugins
fx-auth authentifiziert gegen die Quellen, die Sie bereits haben, und stellt daraus ein einheitliches, signiertes Token aus. Ihre Dienste prüfen dieses Token lokal gegen den öffentlichen Schlüssel — ohne Rückfrage an den Auth-Server, also ohne zusätzliche Latenz und ohne neuen Single Point of Failure im Request-Pfad.

USP · Viele Wege, ein Ergebnis

Zehn Wege hinein — ein einziges Token

Vom Passwort über den Fingerabdruck bis zur NFC-Karte an der Maschine. Jede Anmeldung endet im gleichen Format, das Ihre Anwendungen bereits verstehen.

Anmeldeweg & protokollierter Faktor

Passwort / Benutzernamepwd
TOTP-App als 2. Faktorpwd + totp
E-Mail-Code als 2. Faktorpwd + otp
Passkey als 2. Faktorpwd + hwk
Passkey passwortloshwk
OpenID Connect (Fremd-IdP)oidc
Zertifikat per QR-Codesecurecloud
Einmal-Login / QR aufs Gerätonetime
Login-Token (NFC-Tag)login_token
Service-Token (Server zu Server)psk
  • Ein Format für alles. Egal welcher Weg: das Ergebnis ist ein mit Ihrem privaten Schlüssel signiertes JWT. Ihre Dienste lernen genau ein Token-Format.
  • Nachvollziehbar, womit sich jemand angemeldet hat. Das Token führt die verwendeten Faktoren mit (amr). Eine kritische Aktion darf so Passkey verlangen, während der Rest der App mit Passwort auskommt.
  • Browser bekommt nie das Token in die Hand. Web-Clients erhalten HttpOnly-Cookies; nur native Apps bekommen das Token im Body — und müssen das ausdrücklich anfordern. Der sichere Fall ist der Standardfall.
  • MFA-Pflicht wird laufend nachgeprüft. Aktiviert jemand den zweiten Faktor, verlieren bestehende Sitzungen ohne diesen Faktor beim nächsten Refresh ihre Gültigkeit.
Passwort-Reset E-Mail-Verifikation Einladung & Erstanmeldung Passwortlose Backends

USP · Passwortlos

Face ID statt Passwort — auch in Ihrer App

Passkeys (FIDO2/WebAuthn) sind der einzige Faktor, der Phishing strukturell ausschließt: der Schlüssel verlässt das Gerät nie und ist an Ihre Domain gebunden.

🔐 Als zweiter Faktor

Nach dem Passwort folgt die Bestätigung per Fingerabdruck, Gesicht oder Hardware-Key. Ersetzt die TOTP-App, ohne dass jemand Codes abtippt.

✨ Ganz ohne Passwort

Mit auffindbaren Schlüsseln braucht es nicht einmal einen Benutzernamen: ein Klick, eine Biometrie-Abfrage, angemeldet. Das Konto dahinter löst der Server aus dem Schlüssel selbst auf.

🎚 Vier Betriebsmodi

Pro Deployment schaltbar: aus, nur zweiter Faktor, nur passwortlos oder beides. Sie können also mit 2FA anfangen und später passwortlos freischalten.

📱 Desktop & Mobile

Der Teil, der sonst fehlt: in Desktop- und Mobile-Apps verweigert der Browser-Standard den Dienst. Unser Tauri-Plugin brückt auf die nativen Schnittstellen von iOS, macOS und Android.

Der Challenge-Zustand liegt nicht im Server-Speicher, sondern im Backend — der Auth-Server bleibt damit zustandslos und beliebig replizierbar. Ihre Schlüssel verwalten Nutzer:innen selbst: anlegen, auflisten, löschen.

Zwei-Faktor-Authentifizierung

Zweiter Faktor, ohne Support-Albtraum

Die meisten MFA-Einführungen scheitern nicht an der Technik, sondern am ersten verlorenen Telefon.

📲 TOTP-App

Einrichtung über QR-Code, 30-Sekunden-Codes, kompatibel mit jeder Authenticator-App. Nutzer:innen richten es selbst im Profil ein.

✉️ E-Mail-Code

Sechsstelliger Code per Mail für alle, die keine App installieren wollen — oder als vollständig passwortloser Anmeldeweg.

🆘 Notfall-Weg

Telefon weg? Man lässt sich aus der laufenden Anmeldung heraus einen Code per Mail schicken und kommt hinein — ohne Ticket, ohne Admin, ohne abgeschaltete Sicherheit.

🔒 Verschlüsselte Geheimnisse

TOTP-Schlüssel liegen AES-256-GCM-verschlüsselt in der Datenbank; der Schlüssel dafür wird per Argon2 aus Ihrem Deployment-Geheimnis abgeleitet. Ein Datenbank-Dump allein nützt niemandem.

Und der unangenehme Fall ist mitgedacht: Wer heute MFA aktiviert, entwertet damit automatisch alle eigenen Sitzungen, die noch ohne zweiten Faktor entstanden sind — geprüft bei jedem Refresh, nicht nur beim Login. Challenges laufen nach 90 Sekunden ab und erlauben fünf Versuche.

USP · Offene Plugin-Architektur

Ihre Nutzer:innen bleiben, wo sie sind

Ein zentrales Login heißt normalerweise: alle Konten migrieren. Bei fx-auth heißt es: ein Plugin schreiben.

  • Zwei Sorten Backend. Speicher-Backends (PostgreSQL, SQLite) halten Konten, Rechte und Schlüssel. Identitäts-Backends prüfen Anmeldedaten gegen ein Fremdsystem und lagern die Speicherung dorthin aus.
  • Ein eigenes Identitäts-Backend sind zwei Methoden. Die Backend-Schnittstelle hat rund 90 Methoden — fast alle mit sinnvoller Vorbelegung. Für ein neues Fremdsystem implementieren Sie im Kern nur „prüfe diese Anmeldedaten".
  • Konformitäts-Testsuite inklusive. Ein fertiger Testsatz fährt die komplette Schnittstelle gegen Ihr Plugin, plus eine vollständige In-Memory-Referenzimplementierung als Vorlage.
  • Migration ohne Stichtag. Das Identitäts-Backend spiegelt jedes erfolgreich angemeldete Konto in die neue Datenbank. Altsystem und Neubau laufen parallel, bis das Altsystem leer ist.
  • Mehrere Quellen gleichzeitig. Beschäftigte aus dem AD, Kundschaft aus der Produktdatenbank, Partnerfirmen per Google — parallel konfiguriert, im Login zur Auswahl gestellt, im Token unterscheidbar.

Mitgeliefert

PostgreSQL SQLite LDAP / Active Directory OpenID Connect Zertifikat-Login (QR)

Ihr eigenes Backend

Bestehende Kundendatenbank, ein gewachsenes ERP, eine interne API, ein Branchen-Dienst: alles, was „ist dieses Passwort richtig?" beantworten kann, lässt sich als Anmeldequelle einbinden — ohne den Rest der Plattform anzufassen.

Berechtigungen & Rollen

Rechte, die man im Audit zeigen kann

Ein einziges Modell — im Server, in den Clients, in Ihren eigenen Diensten. Kein „im Frontend ausgeblendet, im Backend erlaubt".

  • Ein Recht ist ein Tripel: was darf getan werden, worauf, und ob es weitergegeben werden darf. Damit ist Delegation Teil des Modells und nicht ein Sonderfall im Code.
  • Ziele mit Platzhaltern. „Darf die Tiere seines Betriebs lesen" ist eine Regel, nicht eine Regel pro Betrieb. Platzhalter werden zur Prüfzeit gebunden und müssen konsistent aufgehen.
  • Rollen bündeln und schachteln — mit Zyklus-Erkennung und Einschränkung des Ziel-Bereichs beim Auflösen. Rollen sind delegierbar.
  • Getippte Rechte statt Strings. Aus Ihrer Konfiguration werden zur Bauzeit Konstanten generiert. Ein Tippfehler im Rechtenamen ist damit ein Compilerfehler, kein stiller Zugriff.
  • Einmal geladen, lokal geprüft. Die Rechte einer Sitzung werden gebündelt abgeholt und zwischengespeichert — Prüfungen im Request-Pfad kosten keinen Netzwerkaufruf.
# Konfiguration: control | target | access_type
"animals.read"  | "<user>.betriebe" | x   # ausführen
"animals.*"     | "*.clients.acme"  | xg  # + delegieren

# Rolle bündelt Rechte, Ziel und Zugriffsart
[[permission_info.permission_groups]]
key         = "herden-manager"
target      = "*.betriebe"
access_type = "xg"
controls    = ["animals.read", "animals.write"]

// Im Code — Namen aus der Config generiert
checker.has_permission(
    permissions::animals.read,
    target!({user}.{betrieb}.betriebe),
    AccessType::Execute, &ctx,
).await?
Ziel-Matching von rechts Wildcards Delegation Gruppen

Integration in Ihre Dienste

Ihre API fragt nicht nach — sie rechnet nach

Ein Auth-Server, den jeder Request kontaktieren muss, ist ein Flaschenhals und ein Ausfallrisiko. Hier prüft jeder Dienst selbst.

AnmeldungNutzer:innen melden sich einmal zentral an
Signiertes Tokenmit privatem Schlüssel unterschrieben
Ihr Dienst prüft lokalöffentlicher Schlüssel, zwischengespeichert
Konto steht bereitName, E-Mail, Profil, Faktoren
Rechte aus dem CachePrüfung ohne Netzwerkaufruf

🦀 Rust / Axum

Fertige Extraktoren: „Anmeldung erforderlich", „Anmeldung optional", ein Rechte-Prüfer, und ein Client, der im Namen der angemeldeten Person weiterfragt. Drei Zeilen bis zur geschützten Route.

⬢ Node.js

Derselbe Prüfer als natives Modul, vorgebaut für Linux, macOS und Windows (x64 + arm64). Kein zweiter, abweichender Prüfpfad in JavaScript.

🌍 Jede andere Sprache

Die Tokens sind Standard-JWTs, der Prüfschlüssel liegt unter der Standard-URL. Python, Java, Go, PHP: jede JWT-Bibliothek genügt — es gibt kein Lock-in auf unsere Clients.

Schlüssel-Rotation ohne Deployment Cookie oder Bearer-Header Ablauf-Toleranz konfigurierbar Reverse-Proxy-Gate für Alt-Anwendungen

USP · Fertig statt fast fertig

Ein HTML-Tag, und das Login steht

Login, Registrierung, Passwort-Reset, Zwei-Faktor-Einrichtung, Profil, Nutzerverwaltung: fertig gebaut, übersetzt und getestet. Sie schreiben davon nichts.

🧩 Web-Component

Ein Custom Element mit Shadow DOM — funktioniert in Vue, React oder reinem HTML, ohne Ihr Styling zu berühren.

🖥 Gehostete Login-Seite

Alternativ die klassische Variante: Ihre App leitet weiter, man kommt angemeldet zurück.

📦 TypeScript-Client

npm-Paket mit generierten Typen aus den Server-Modellen. Falsche Feldnamen fallen beim Bauen auf.

📱 Tauri-Plugin

Persistente Sitzungen und native Passkeys für Desktop- und Mobile-Apps aus derselben Codebasis.

<!-- Vollständiges Login in einer Zeile -->
<fx-auth api-base="/api/v1" language="de"></fx-auth>

// Reagieren, wenn jemand drin ist
el.addEventListener('fx-login', () => router.push('/'))
  • Deutsch und Englisch ausgeliefert, weitere Sprachen als Textdatei nachrüstbar — inklusive der E-Mail-Vorlagen.
  • Ihr Titel, Ihre Felder, Ihre Startseiten-Links kommen aus der Konfiguration, nicht aus einem Fork.
  • Als Modal oder eingebettet, gezielt auf einen Schritt gesetzt (z. B. direkt „Passwort vergessen").

Föderation

OAuth2 in beide Richtungen

fx-auth kann fremde Konten akzeptieren — und Ihr Konto-System für Fremde öffnen. Das ist der Unterschied zwischen „wir haben ein Login" und „wir sind eine Plattform".

⬅️ Als Client: Anmelden mit …

Google, Microsoft Entra/Azure AD, Keycloak oder jeder andere OpenID-Provider. Konfiguration ist eine Handvoll Zeilen; die Provider-Details holt der Server beim Start selbst ab. Aus den Angaben des Providers werden Ihre Profilfelder gefüllt — welches Feld woher kommt, bestimmen Sie.

Mehrere Provider parallel Profil-Zuordnung Eigenes Token danach

➡️ Als Server: Ihre Kundschaft bindet an

Fremde Anwendungen — Partner-Portale, Kunden-Integrationen, Ihre eigenen Zusatzprodukte — holen sich Tokens bei Ihnen. Standard-Verfahren (Authorization Code mit PKCE), Verwaltung der Anwendungen in der UI, und pro Freigabe-Umfang genau die Nutzerdaten, die freigegeben wurden.

PKCE (nur S256) Rotierende Refresh-Tokens Umfang → Nutzerdaten

Ein Detail, das den Unterschied macht: Refresh-Tokens werden bei jeder Nutzung ersetzt. Taucht ein bereits verbrauchtes Token wieder auf, ist das ein Diebstahl-Signal — und der Server entzieht diesem Konto bei dieser Anwendung sofort alle Tokens. Geheimnisse liegen ausschließlich als Hash, das Client-Secret wird genau einmal angezeigt.

USP · Sicherheit

Verteidigung in der Tiefe — nicht als Nachtrag

Die Angriffe auf ein Login sind bekannt. Jede Antwort darauf ist hier eingebaut, nicht optional.

🕵️ Keine Konto-Ausspähung

Falsches Passwort, unbekanntes Konto, kaputtes Backend: nach außen dieselbe Antwort. „Passwort vergessen" bestätigt jede Adresse — auch die, die es nicht gibt. Aus dem Verhalten lässt sich keine Nutzerliste ableiten.

#️⃣ Nichts im Klartext

Passwörter und Einmal-Links liegen Argon2-gehasht, Refresh- und Anwendungs-Geheimnisse als Hash, TOTP-Schlüssel verschlüsselt. Was Sie in der Datenbank sehen, hilft einem Angreifer nicht weiter.

🎯 Tokens mit Zweckbindung

Ein Link zum Passwort-Zurücksetzen lässt sich nicht als E-Mail-Bestätigung einlösen und umgekehrt. Jeder Einmal-Link gilt für genau einen Zweck, einmal, und begrenzte Zeit.

⏱ Ratenbegrenzung & Sperren

Anmeldung, Zwei-Faktor-Codes und Registrierung sind einzeln begrenzt (Vorgabe: fünf Anmeldeversuche in 15 Minuten). Konten lassen sich sperren; gesperrte Konten kommen über keinen Weg herein.

🍪 Sicher als Standardfall

Ohne ausdrückliche Anforderung liefert der Server nie ein Token im Antworttext, sondern nur HttpOnly-Cookies — auch bei einem Client, der den Header vergisst. Fehlkonfiguration führt zur sicheren Variante.

🔑 Geheimnisse aus der Umgebung

Jeder Config-Wert darf auf eine Umgebungsvariable verweisen, also aus Vault, Secrets-Manager oder systemd kommen. Signaturschlüssel werden beim ersten Start selbst erzeugt.

Betrieb im Alltag

Nutzerverwaltung, die schon fertig ist

Nicht nur Anmelden — auch alles danach: einladen, sperren, zurücksetzen, nachvollziehen.

👥 Konten & Suche

Suchen über alle Backends, Details einsehen, Profil bearbeiten, sperren und entsperren, Passwörter zurücksetzen — jede Aktion an ein eigenes Recht gebunden, nicht an „ist Admin".

✉️ Einladen statt registrieren

Konten vorab anlegen und per Mail einladen: die eingeladene Person bestätigt ihre Daten, setzt ihr Passwort und ist verifiziert. Für Umgebungen, in denen sich niemand selbst anmeldet.

🏷 Gruppen mit Einladungen

Gruppen anlegen, Mitglieder einladen, annehmen, ablehnen, verlassen. Wer die Gruppe besitzt, verwaltet die eigenen Leute selbst — ohne Zugriff auf den Rest des Systems.

🎭 „Ansehen als"

Der Support sieht die Anwendung mit den Augen der betroffenen Person — an ein eigenes Recht gebunden, und das Token trägt sichtbar mit, wer hier wen ansieht. Kein „ich habe mal eben ein Passwort geändert".

📝 Profilfelder aus der Config

Welche Felder ein Konto hat, welche Pflicht sind, welche im Token landen: in der Konfiguration beschrieben. Ein neues Feld ist eine Zeile, kein Datenbank-Schema und kein Release.

🤖 Maschinen-Konten

Dienste bekommen ein Token mit fest umrissenen Rechten, definiert in der Konfiguration und in keiner Datenbank. Kein Sammel-Admin-Konto für Cronjobs.

Deployment

Eine Binary, eine Konfigurationsdatei

Kein Java-Application-Server, kein Cluster aus Hilfsdiensten, keine externe Session-Datenbank.

  • Drei Wege in Ihre Infrastruktur: Container-Image (amd64 und arm64), RPM mit systemd-Unit für Red-Hat-Umgebungen, npm-Pakete für die Clients — alle drei aus derselben Freigabe.
  • Speicherbedarf im Megabyte-Bereich statt Gigabyte: Rust ohne Laufzeitumgebung. Läuft genauso auf einer kleinen VM wie in Kubernetes.
  • Ein Cookie für alle Subdomains. Liegen Ihre Anwendungen unter einer gemeinsamen Domain, ist man überall angemeldet — ohne Weiterleitungs-Karussell. Getrennte Domains sind ebenfalls unterstützt.
  • Alt-Anwendungen ohne Umbau schützen: ein fertiges Reverse-Proxy-Muster lässt jeden Request vorab prüfen und leitet Unangemeldete auf die Login-Seite — ganz ohne Änderung an der Anwendung dahinter.
  • Sauberes Herunterfahren. Laufende Mail- und Datenbankvorgänge werden beendet, bevor der Prozess geht — ein normales Deployment kostet keine halb geschriebene Registrierung.
OpenAPI + Swagger-UI eingebaut Health-Endpunkt Strukturierte Logs Weiterleitungs-Zustände im Speicher: OIDC- und QR-Login je Instanz

Von null auf angemeldet

Config schreiben Starten
Schlüssel entstehen selbst Login steht

Datenbank-Migrationen laufen beim Start, die Signaturschlüssel werden beim ersten Start erzeugt. Der erste Admin-Zugang wird über die E-Mail-Adresse in der Konfiguration bestimmt.

Dokumentiert, nicht überliefert

Vollständige Anleitung zu jedem Anmeldeweg, jedem Backend, den Clients, den Rechten und dem Deployment — automatisch aus dem Quellcode gebaut und bei jeder Änderung neu veröffentlicht.

Substanz

Die Plattform in Zahlen

Kein Prototyp, den man noch fertig bauen muss.

10Anmeldewege
94API-Endpunkte
5+Auth-Backends
210automatisierte Tests
88kZeilen Rust
1Binary

Ein Modell für alles

Dieselbe Rechte-Engine im Server, in den Clients und in Ihren eigenen Diensten. Was das Frontend ausgraut, verweigert das Backend — weil es dieselbe Regel auswertet.

Ihre Quellen bleiben Ihre

Verzeichnisdienst, Altsystem, Fremd-Provider oder eigenes Plugin: die Identitätshoheit wandert nicht in ein Produkt, das Sie später nicht mehr verlassen können.

Ihr Code, Ihr Betrieb

Selbst gehostet, kein Nutzerpreis, kein Anmeldungs-Kontingent, keine Daten bei Dritten. Sie bekommen den Quellcode und können ihn weiterentwickeln — mit uns oder ohne uns.

„Softwareentwicklung ist in erster Linie
Vertrauenssache."

Anmeldung ist die Stelle, an der Ihre Nutzer:innen Ihnen zum ersten Mal vertrauen. Lassen Sie uns darüber sprechen, wie viele Logins Sie heute pflegen — und wie schnell daraus eines wird.