Authentication

OpenID Connect

OAuth 2.0 autorisiert den Zugriff; OpenID Connect fügt die Identitätsebene hinzu, mit der Sie Benutzer anmelden können. Es ist das Protokoll hinter dem „Anmelden mit...“-Button.

intermediate15 min readUpdated 20. Sept. 2026
oidc.js
js
// oidc.js
import { Issuer } from "openid-client";

const issuer = await Issuer.discover("https://accounts.example.com");
const client = new issuer.Client({
  client_id: process.env.OIDC_CLIENT_ID,
  client_secret: process.env.OIDC_CLIENT_SECRET,
  redirect_uris: ["https://app.example.com/callback"],
  response_types: ["code"],
});

export const loginUrl = client.authorizationUrl({
  scope: "openid profile email",
  code_challenge: challenge,
  code_challenge_method: "S256",
});
Basiert auf
OAuth 2.0
Kern-Artefakt
ID token (JWT)
Haupt-Flow
Authorization code + PKCE
Discovery
/.well-known/openid-configuration
Keys
JWKS endpoint
Optionaler Aufruf
UserInfo endpoint

Warum es wichtig ist

Was OpenID Connect ergänzt

Echte Authentifizierung

OAuth gewährt Zugriff auf Ressourcen; OIDC beweist die Identität. Das ID token ist eine signierte Aussage darüber, dass der Benutzer sich beim Provider authentifiziert hat.

Ein Login, viele Apps

Der gleiche Provider kann Benutzer in jeder App einer Organisation anmelden – so funktioniert Single Sign-On in der Praxis.

Standardisiert und verifizierbar

Discovery-Dokumente und veröffentlichte Keys ermöglichen es Clients, Tokens ohne proprietären, provider-spezifischen Code zu validieren.

Das Gesamtbild

Die drei Komponenten eines Logins

Der Provider authentifiziert den Benutzer, das ID token bestätigt, wer er ist, und der Client validiert dies, bevor er dem Token vertraut.

ID token

Bestätigen

Ein JWT, das Subject, Issuer, Audience und Expiry enthält, vom Provider signiert und vom Client verifiziert wird.

Authorization code

Austauschen

Der Browser erhält einen kurzlebigen Code, und das Backend tauscht diesen gegen Tokens ein, sodass Anmeldedaten niemals den Front-Channel erreichen.

Validierung

Vertrauen

Prüfen Sie die Signatur gegen die JWKS des Providers und fixieren Sie Issuer, Audience und Expiry, bevor Sie Claims auslesen.

HTML5 auf einen Blick

Die Bausteine von OIDC

Discovery

Ein bekanntes Dokument listet die Endpunkte und unterstützten Funktionen auf.

ID token

Ein signiertes JWT, das beschreibt, wer sich gerade angemeldet hat.

PKCE

Ein pro Anfrage generiertes Secret, das den Code-Austausch für Public Clients schützt.

Access token

Ein Berechtigungsnachweis für API-Aufrufe, getrennt von der Identitätsbestätigung.

UserInfo

Ein Endpunkt, der Profil-Claims für das Access token zurückgibt.

JWKS

Die öffentlichen Schlüssel des Providers, die für die Verifizierung abgerufen und gecacht werden.

Ablauf

Der Authorization Code Flow mit PKCE

Der Browser sieht nur jemals einen Code. Tokens werden im Backend ausgetauscht, wo das Client Secret und der Code Verifier liegen.

  1. 1

    Login starten

    Der Client generiert einen Code Verifier und eine Challenge und leitet den Browser dann mit dem Scope openid zum Authorization Endpoint des Providers weiter.

  2. 2

    Authentifizieren

    Der Benutzer meldet sich beim Provider an; dies ist die einzige Partei, die das Passwort oder den zweiten Faktor sieht.

  3. 3

    Code empfangen

    Der Provider leitet mit einem kurzlebigen Authorization Code zurück zur registrierten Redirect URI des Clients.

  4. 4

    Code austauschen

    Das Backend sendet den Code und den Verifier an den Token Endpoint und erhält ein ID token, ein Access token und optional ein Refresh token.

  5. 5

    ID token validieren

    Verifizieren Sie die Signatur gegen die JWKS und prüfen Sie dann iss, aud, exp und nonce, bevor Sie einem Claim vertrauen.

  6. 6

    Session etablieren

    Erstellen Sie Ihre eigene Session oder ein Token basierend auf dem verifizierten Subject. OIDC authentifiziert; es ersetzt nicht Ihr Session-Modell.

Eine kurze Geschichte

Vom delegierten Zugriff zum föderierten Login

  1. 2012

    OAuth 2.0 erscheint

    RFC 6749 standardisiert die delegierte Autorisierung, sagt aber nichts über die Identität aus.

    12
  2. 2014

    OpenID Connect 1.0

    Eine schlanke Identitätsebene wird auf OAuth aufgesetzt, die das ID token und Discovery definiert.

    14
  3. 2015

    Das ID token ist ein JWT

    JWT wird zum Token-Format, und Identity Provider konvergieren darauf.

    15
  4. 2019

    PKCE wird überall empfohlen

    Die OAuth 2.0 Security Best Current Practice erweitert PKCE auf Confidential Clients.

    19
  5. Heute

    Der Standard für Logins

    „Anmelden mit...“-Buttons und Enterprise SSO sind im Grunde OIDC.

    Heute

Der vollständige Leitfaden

OpenID Connect: Alles was Sie wissen müssen

OAuth ist Autorisierung, OIDC ist Authentifizierung

OAuth 2.0 beantwortet eine einzige Frage: Darf diese Anwendung im Namen dieses Benutzers handeln? Es stellt Access Tokens für APIs aus. Bewusst wird dabei nichts darüber ausgesagt, wer der Benutzer eigentlich ist. Diese Lücke führte über Jahre hinweg zu Verwirrung – OpenID Connect ist die Lösung dafür.

OpenID Connect ist eine schlanke Identitätsschicht auf Basis von OAuth 2.0. Es standardisiert den Login-Flow, definiert ein ID token, das die Identität bestätigt, und stellt Metadaten bereit, damit Clients ohne Rätselraten konfiguriert werden können. Wenn Sie auf „Mit Google anmelden“ oder einen Enterprise-SSO-Button klicken, nutzen Sie OIDC.

Die praktische Faustregel: Wenn Sie wissen müssen, wer der Benutzer ist, verwenden Sie OIDC. Wenn eine App etwas im Namen des Benutzers tun soll, verwenden Sie OAuth. Die meisten Logins benötigen beides, weshalb die beiden Standards normalerweise gemeinsam eingesetzt werden.

Das ID Token

Das Herzstück von OIDC ist das ID Token: ein JWT, das vom Identity Provider signiert wurde. Es enthält die Claims, die Ihre Anwendung benötigt, um einen Login zu bestätigen.

  • sub — die stabile, eindeutige Kennung für den Benutzer.
  • iss — der Issuer, damit Sie wissen, welcher Provider das Token signiert hat.
  • aud — die Client ID, für die es ausgestellt wurde; ein Token für eine andere App muss abgelehnt werden.
  • exp und iat — wann es abläuft und wann es ausgestellt wurde.
  • nonce — spiegelt den von Ihnen gesendeten Wert wider, um das Token an diesen Login-Versuch zu binden.
  • email, name, picture — Profil-Claims, sofern die angeforderten Scopes dies zulassen.

Das ID Token ist für Ihren Client gedacht. Es ist nicht die Anmeldedaten, die Sie an nachgelagerte APIs senden — das ist die Aufgabe des Access Tokens. Die strikte Trennung dieser beiden vermeidet einen häufigen Designfehler.

Discovery

Jeder konforme Provider veröffentlicht ein Discovery-Dokument:

https://accounts.example.com/.well-known/openid-configuration

Darin werden die Endpunkte für Authorization, Token, Userinfo und JWKS sowie die unterstützten Scopes und Algorithmen aufgelistet. Clients rufen dieses Dokument beim Start ab und konfigurieren sich selbst, sodass nichts hard-coded ist und Änderungen am Provider automatisch übernommen werden.

Der Authorization Code Flow mit PKCE

Der empfohlene Flow hält die Credentials aus dem Browser fern. Der Browser verarbeitet lediglich einen kurzlebigen Code.

  1. Der Client generiert einen zufälligen code_verifier, hasht diesen zu einem code_challenge und leitet den Browser mit scope=openid an den Provider weiter.
  2. Der Benutzer authentifiziert sich beim Provider – dies ist die einzige Stelle, an der ein Passwort oder ein zweiter Faktor eingegeben wird.
  3. Der Provider leitet mit einem Authorization code zurück.
  4. Das Backend tauscht den Code zusammen mit dem Verifier gegen ein ID Token und ein Access Token ein.
  5. Der Client validiert das ID Token und erstellt eine Session.

PKCE (Proof Key for Code Exchange) bindet den Code an den Client, der ihn angefordert hat. Ein während der Übertragung abgefangener Code ist ohne den Verifier nutzlos. Sende immer state, um CSRF zu verhindern, und nonce, um das ID Token an die Anfrage zu binden.

Scopes und Claims

Scopes legen fest, welche Claims Sie erhalten können.

  • openid — erforderlich; ohne diesen Scope ist die Anfrage reines OAuth und kein OIDC.
  • profile — Name, Profilbild und andere Profilfelder.
  • email — die E-Mail-Adresse des Benutzers und ob diese verifiziert ist.
  • offline_access — fordert einen Refresh Token an, damit die App zu einem späteren Zeitpunkt agieren kann.

Fordern Sie nur das Minimum an, das Sie tatsächlich benötigen. Jeder zusätzliche Scope bedeutet mehr zu schützende Daten und führt bei einigen Providern zu einer höheren Hürde bei der Zustimmung des Benutzers.

Der userinfo-Endpunkt

Das ID-Token enthält oft nur die grundlegendsten Informationen. Für weitere Profildaten rufen Sie den userinfo-Endpunkt mit dem Access-Token auf:

const userinfo = await client.userinfo(tokenSet.access_token);
// { sub, name, email, email_verified, picture, ... }

Betrachten Sie die sub aus userinfo als maßgeblich und stellen Sie sicher, dass sie mit der sub im ID-Token übereinstimmt. Vertrauen Sie einer E-Mail-Adresse niemals als stabile Kennung – Nutzer ändern diese gelegentlich.

Validierung des ID-Tokens

Die Validierung ist der Schritt, der das gesamte Verfahren sicher macht – und gleichzeitig der Schritt, der am häufigsten falsch implementiert wird. Das Dekodieren des Payloads ist keine Verifizierung; jeder kann ein Token mit beliebigen Claims erstellen.

Bevor Sie einem Claim vertrauen:

  1. Signatur — verifizieren Sie diese mit dem öffentlichen Schlüssel des Providers vom JWKS-Endpoint unter Verwendung eines erlaubten Algorithmus.
  2. Issueriss muss dem erwarteten Provider entsprechen.
  3. Audienceaud muss Ihre Client-ID sein.
  4. Expiryexp muss in der Zukunft liegen (unter Berücksichtigung eines geringen Clock Skews).
  5. Nonce — muss mit dem Wert übereinstimmen, den Sie für diesen Login gesendet haben.

Nutzen Sie eine gepflegte Library wie openid-client und überlassen Sie ihr diese fünf Schritte. Implementieren Sie das JWT-Parsing für die Authentifizierung niemals selbst.

Sessions nach dem Login

OIDC authentifiziert einmalig beim Login. Es verwaltet nicht die Session deiner Anwendung. Erstelle nach der Validierung des ID tokens deine eigene Session – einen Cookie oder einen Token –, die auf sub basiert.

Behalte diese drei Dinge strikt getrennt:

  • Das ID token ist für deinen Client bestimmt und beweist die Identität.
  • Das access token dient dem Aufruf von APIs.
  • Deine Session ist die Art und Weise, wie deine App den Benutzer über mehrere Requests hinweg erkennt.

Werden diese vermischt, führt dies dazu, dass Provider-Tokens im Browser landen oder ein ID token als API-Credential verwendet wird – beides sind Fehler.

Logout

Der lokale Logout kommt zuerst: Löschen Sie Ihre Session, damit der Benutzer aus Ihrer App abgemeldet wird. Dies liegt immer in Ihrer Kontrolle und ist stets zuverlässig.

Der federierte Logout erfolgt nach dem Best-Effort-Prinzip. Sie können mit einem id_token_hint auf den End-Session-Endpoint des Providers weiterleiten, aber nicht jeder Provider unterstützt dies und die Weiterleitung wird möglicherweise nicht abgeschlossen. Gestalten Sie Ihren Prozess so, dass das Löschen der eigenen Session ausreichend ist, und verlassen Sie sich niemals darauf, dass der Provider den Benutzer abmeldet.

Wann man OIDC einsetzen sollte

OIDC ist die richtige Wahl, wenn:

  • Sie die Speicherung von Passwörtern komplett vermeiden möchten.
  • Sie Enterprise SSO oder „Anmelden mit…“-Buttons benötigen.
  • Ihre Anwendung eine von mehreren Apps ist, die sich einen Login teilen sollen.
  • Sie MFA und die Kontowiederherstellung einem spezialisierten Anbieter überlassen möchten.

OIDC ist aufwendiger als ein einfaches Passwort-Formular. Für ein kleines internes Tool mit einer Handvoll Nutzern könnten Session Auth und Password Hashing einfacher und völlig ausreichend sein.

Best Practices

  • Verwenden Sie immer den Authorization Code Flow mit PKCE.
  • Senden und verifizieren Sie sowohl state als auch nonce.
  • Validieren Sie das ID-Token vollständig – Signatur, Issuer, Audience und Ablaufdatum.
  • Nutzen Sie Discovery anstelle von hartcodierten Endpunkten.
  • Fordern Sie nur die minimal notwendigen Scopes an.
  • Trennen Sie Ihre Session von den Provider-Tokens.
  • Speichern Sie Client Secrets auf dem Backend, niemals im Browser.

Häufige Fehler

  • OAuth als Authentifizierung zu betrachten und die Identität aus einem Access Token abzuleiten.
  • Das ID Token zu dekodieren, ohne dessen Signatur zu verifizieren.
  • Die aud- oder iss-Prüfungen zu überspringen, sodass Tokens von anderen Apps akzeptiert werden.
  • Den Implicit Flow zu verwenden und Tokens in der URL offenzulegen.
  • Die E-Mail-Adresse als Primary Key des Benutzers zu verwenden.
  • Provider-Tokens an die eigenen APIs zu senden, als wären sie Session-Credentials.
  • Zu vergessen, dass der Logout zuerst die eigene Session beenden muss.

Wie geht es weiter?

Falls Sie es noch nicht gelesen haben, beginnen Sie mit OAuth 2.0, um das Autorisierungsprotokoll zu verstehen, auf dem OIDC aufbaut, und mit dem JWT-Guide für das Token-Format. Sobald der Login erfolgreich war, zeigt der Guide zu Session Auth, wie der Benutzer angemeldet bleibt, und RBAC & Permissions behandelt, was diese tun dürfen.

In der Praxis

Ein Login in vier Teilen

Discovery entfernt hartcodierte URLs, die Authorization URL startet den Flow, und der Callback tauscht aus und validiert.

terminal
curl https://accounts.example.com/.well-known/openid-configuration
# { "issuer": "...", "authorization_endpoint": "...",
#   "token_endpoint": "...", "jwks_uri": "...", ... }

Den Flow wählen

Nutzen Sie den Authorization Code Flow mit PKCE. Implicit und Password Grants leaken Tokens über den Browser und sind veraltet.

Bevorzugt
GET /authorize?response_type=code
  &code_challenge=...&code_challenge_method=S256
Vermeiden
GET /authorize?response_type=token
# token returned in the URL fragment

Dem ID token vertrauen

Validieren Sie jedes Token gegen die veröffentlichten Keys und erwarteten Werte. Das Dekodieren eines JWT ist nicht dasselbe wie dessen Verifizierung.

Bevorzugt
// verify signature, iss, aud, exp, nonce
const claims = tokenSet.claims();
Vermeiden
const claims = JSON.parse(
  Buffer.from(idToken.split(".")[1], "base64url"),
);

Abwägungen

Sollten Sie Ihren Login auf OIDC aufbauen?

OIDC eliminiert die Passwortverwaltung und ermöglicht SSO, auf Kosten einer externen Abhängigkeit und eines Protokolls, das man vor dem Deployment verstehen sollte.

Strengths

  • Keine Passwörter speichern

    Der Provider verwaltet Anmeldedaten, MFA und Recovery, sodass Ihre Anwendung niemals ein Passwort sieht oder hasht.

  • Single Sign-On inklusive

    Benutzer melden sich einmal an und erreichen jede verbundene App; Enterprise-Kunden erhalten das SSO, das sie erwarten.

  • Standardisiert und portabel

    Discovery und JWKS bedeuten, dass derselbe Code mit vielen Providern funktioniert und ein Providerwechsel eine Konfigurationsänderung statt eines Rewrites ist.

Trade-offs

  • Abhängigkeit von der Verfügbarkeit des Providers

    Wenn der Identity Provider down ist, kann sich niemand anmelden. Behandeln Sie ihn daher als kritische Abhängigkeit und überwachen Sie ihn.

  • Leicht falsch zu validieren

    Das Dekodieren eines Tokens ohne Prüfung der Signatur, des Issuers oder der Audience ist eine reale Schwachstelle, die oft in Produktion auftritt.

  • Mehr bewegliche Teile

    Redirects, State, Nonce, PKCE und Token-Austausch sind komplexer zu implementieren als ein Session-Cookie und ein Passwort-Formular.

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, OpenID Connect zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch OpenID Connect — mit Quizzen und echtem Code, den Sie im Browser ausführen können.