1 / 16

freshX

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 bleiben, wo sie heute schon sind.

FreshX GmbH · freshx.de 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.

🗂 Nutzer in vier Silos

Mitarbeiter im Active Directory, Kunden in der Produktdatenbank, Partner 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 Auditor 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 NUTZER 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 ein Nutzer 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 bestätigt der Nutzer 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. Verwaltung ihrer Schlüssel machen Nutzer 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 Nutzer, der sein Telefon verloren hat.

📲 TOTP-App

Einrichtung über QR-Code, 30-Sekunden-Codes, kompatibel mit jeder Authenticator-App. Nutzer 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? Der Nutzer 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 bleiben, wo sie sind

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

  • Zwei Sorten Backend. Speicher-Backends (PostgreSQL, SQLite) halten Nutzer, 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 jeden erfolgreich angemeldeten Nutzer in die neue Datenbank. Altsystem und Neubau laufen parallel, bis das Altsystem leer ist.
  • Mehrere Quellen gleichzeitig. Mitarbeiter aus dem AD, Kunden aus der Produktdatenbank, Partner 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 einem Auditor 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 melden sich einmal zentral an
Signiertes Tokenmit privatem Schlüssel unterschrieben
Ihr Dienst prüft lokalöffentlicher Schlüssel, zwischengespeichert
Nutzer steht bereitName, E-Mail, Profil, Faktoren
Rechte aus dem CachePrüfung ohne Netzwerkaufruf

🦀 Rust / Axum

Fertige Extraktoren: „Nutzer erforderlich", „Nutzer optional", ein Rechte-Prüfer, und ein Client, der im Namen des angemeldeten Nutzers 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, der Nutzer 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 der Nutzer 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 Kunden binden 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 Nutzer 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, unbekannter Nutzer, 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.

👥 Nutzer & 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

Nutzer vorab anlegen und per Mail einladen: der Eingeladene bestätigt seine Daten, setzt sein Passwort und ist verifiziert. Für Umgebungen, in denen sich niemand selbst anmeldet.

🏷 Gruppen mit Einladungen

Gruppen anlegen, Mitglieder einladen, annehmen, ablehnen, verlassen. Der Gruppen-Eigentümer verwaltet seine Leute selbst, ohne Zugriff auf den Rest des Systems.

🎭 „Ansehen als"

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

📝 Profilfelder aus der Config

Welche Felder ein Nutzer 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 der Nutzer ü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 wird über seine 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.

freshX

„Softwareentwicklung ist in erster Linie
Vertrauenssache."

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

FreshX GmbH freshx.de dominik@freshx.de