Files
work/notes/nextcloud/Notes/IT-Know-How/web und cloud gedoens/OAuth2.md
T
2026-03-17 19:04:55 +01:00

361 lines
14 KiB
Markdown
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Im Folgenden bekommst du eine Einführung in OAuth 2, so dass du danach:
- weißt, was OAuth 2 grundsätzlich ist,
- es von verwandten Konzepten wie „Login mit Google“, OpenID Connect oder reiner Authentifizierung unterscheiden kannst,
- verstehst, welche Probleme OAuth 2 löst und welche neuen Herausforderungen es mit sich bringt,
- und ein paar praxisnahe Szenarien im Kopf hast.
---
## 1. Grundsätzliche Definition: Was ist OAuth 2?
**Kurze Definition**:
OAuth 2 ist ein *Autorisierungs*-Framework. Es regelt, wie eine Anwendung (Client) **im Namen eines Benutzers** sicher auf Ressourcen (z.B. APIs, Daten) zugreifen kann, **ohne dass die Anwendung das Passwort des Benutzers kennen muss**.
Es geht also primär um:
- **Zugriffsrechte (Authorization)**
- **Delegation**: „Ich (Nutzer) erlaube App X, auf meine Daten bei Dienst Y zuzugreifen.“
### Zentrales Prinzip
Statt:
- Benutzer gibt sein Passwort direkt bei jeder Drittanbieter-App ein
nutzt man:
- Benutzer loggt sich beim **vertrauenswürdigen Dienst** ein (z.B. Google, GitHub, dein Unternehmens-Identity-Server)
- Dieser Dienst stellt ein **Token** aus (eine Art Eintrittskarte)
- Drittanbieter-App nutzt dieses Token, um beim API-Server Zugriff zu bekommen
Dadurch muss die Drittanbieter-App nie das Passwort sehen sie bekommt **nur einen begrenzten, kontrollierten Zugriff**.
---
## 2. Die wichtigsten Rollen in OAuth 2
Um Beispiele zu verstehen, braucht man die Standardrollen:
1. **Resource Owner**
Der Besitzer der Daten/Ressourcen meist der **Benutzer**.
2. **Client**
Die Anwendung, die im Namen des Benutzers zugreifen möchte
(z.B. eine mobile App, eine Web-App, ein Backend-Service).
3. **Resource Server**
Die API/das System, das die geschützten Ressourcen bereitstellt
(z.B. Google Calendar API, GitHub API, Unternehmens-REST-API).
4. **Authorization Server**
Der Server, der:
- den Benutzer authentifiziert (z.B. Login-Formular) und
- **Tokens** ausstellt (Access Tokens, optional Refresh Tokens).
Oft sind Authorization Server und Resource Server derselbe technische Dienst, aber **konzeptionell** werden sie getrennt betrachtet.
---
## 3. Grund-Mechanik: Wie läuft ein OAuth-2-Flow ab?
Stark vereinfacht am typischen Web-Szenario:
1. Benutzer nutzt eine Drittanbieter-App (Client) und klickt z.B. auf:
„Verbinde dich mit meinem Google-Kalender“.
2. Client leitet den Browser zum **Authorization Server** (z.B. accounts.google.com) weiter:
- mit Angaben wie: „Diese App möchte Zugriff auf Kalenderdaten“.
3. Benutzer loggt sich **beim Authorization Server** ein (falls nicht schon eingeloggt).
4. Benutzer bekommt eine Seite angezeigt:
„Die Anwendung X möchte auf Ihre Kalenderdaten zugreifen. Erlauben? (Ja/Nein)“
5. Wenn Benutzer zustimmt:
- Authorization Server schickt den Benutzer zurück zur App
- Die App bekommt einen **Authorization Code** (bei einem gängigen Flow).
6. Die App tauscht diesen Code im Hintergrund beim Authorization Server gegen ein **Access Token** (und evtl. ein **Refresh Token**) ein.
7. Die App nutzt das Access Token, um beim **Resource Server** (z.B. Google Calendar API) Daten abzufragen.
Der Benutzer muss sein **Passwort nur beim Authorization Server** eingeben nicht bei der Drittanbieter-App.
---
## 4. Abgrenzung zu ähnlichen / verwandten Begriffen
### 4.1 OAuth 2 (Authorization) vs. Authentifizierung (Login)
**Authentifizierung**: „Wer bist du?“
**Autorisierung**: „Worauf darfst du zugreifen?“
- OAuth 2 löst formal **Autorisierung** (Delegation von Zugriffsrechten).
- Viele Systeme nutzen OAuth 2 aber **im Zusammenhang mit Login**, was verwirrend sein kann.
Ein Login mit Google, bei dem eine Anwendung am Ende weiß „dieser User ist Max Mustermann“, basiert meist auf **OpenID Connect**, das **auf OAuth 2 aufsetzt**.
### 4.2 OAuth 2 vs. OpenID Connect (OIDC)
- **OAuth 2**: Spezifiziert, wie Clients **Access Tokens** bekommen, um auf APIs zuzugreifen.
- **OpenID Connect**: Erweiterung auf Basis von OAuth 2, um **Identität** zu transportieren.
OIDC liefert zusätzlich:
- ein **ID Token** (meist ein [[JWT token]]), das Informationen wie:
- User-ID
- E-Mail
- Name
enthält.
Praxis-Beispiele:
- „Mit Google anmelden“ (Login) → **OpenID Connect**
- „Google Kalender-API nutzen“ → **OAuth 2** (Autorisierung für API-Zugriff)
### 4.3 OAuth 2 vs. API-Key
**API-Key**:
- Meist ein statischer Schlüssel, der im Client eingebaut ist.
- Unterscheidet nicht zwischen verschiedenen Benutzern.
- Hat wenig feingranulare Rechte (oft: „alles oder nichts“).
- Sicherheitsrisiko bei Leaks (z.B. im Frontend-Code).
**OAuth 2**:
- Nutzerbezogen (Access Token repräsentiert den Benutzer/das Delegationsrecht).
- Token haben meist begrenzte Lebensdauer.
- Zugriffsrechte (Scopes) sind feiner steuerbar.
### 4.4 OAuth 2 vs. SAML
- **SAML**: Älterer Standard, XML-basiert, häufig in Unternehmensumgebungen für SSO verwendet.
- **OAuth 2 / OIDC**: JSON/HTTP-basiert, leichtergewichtig, stark im Web- und Mobile-Bereich verbreitet.
Grober Merksatz:
- SAML: klassische Unternehmen, Single Sign-On im Browser, ältere Infrastruktur.
- OAuth 2 + OIDC: moderne Web-/Mobile-Apps, REST-APIs, Microservices.
---
## 5. Welche Probleme löst OAuth 2?
### 5.1 Vermeidung von Passwortweitergabe an Drittanbieter
Früher:
Eine App wollte auf Gmail zugreifen => Benutzer musste **sein Gmail-Passwort** in dieser App eingeben.
Risiken:
- App könnte Passwort speichern oder missbrauchen.
- Bei Passwortänderung müsste der Benutzer alles neu einrichten.
- Anbieter (Google) hat keine Kontrolle, welche App das tut.
Mit OAuth 2:
- Benutzer loggt sich nur bei Google ein.
- Drittanbieter-App erhält nur ein **Token mit begrenzten Rechten**, kein Passwort.
**Praxisbeispiel**:
Eine To-Do-App möchte deine Google Kalender-Einträge anzeigen:
Du klickst „Mit Google verbinden“, wirst zu Google geleitet, bestätigst die Berechtigungen und die App sieht danach deine Kalender ohne dein Passwort zu kennen.
### 5.2 Feingranulare Zugriffsrechte (Scopes)
Mit **Scopes** kann eingeschränkt werden, worauf eine App zugreifen darf.
Beispiele:
- `read_calendar`: nur Leserechte auf Kalender
- `write_calendar`: Schreibrechte auf Kalender
- `email`: Zugriff auf deine E-Mail-Adresse
- `profile`: Zugriff auf deine Basisprofildaten
So kann der Benutzer (und auch der Resource Server) klar kontrollieren:
- Eine App darf z.B. **nur lesen**, nicht schreiben.
- Eine App darf **nur auf E-Mail und Profil**, nicht auf Kontakte oder Drive zugreifen.
### 5.3 Zeitlich begrenzte Tokens
**Access Tokens** sind typischerweise kurzlebig (z.B. 560 Minuten).
- Wenn ein Token geleakt wird, ist der Schaden zeitlich begrenzt.
- Über Revocation-Mechanismen kann der Zugriff vorzeitig beendet werden.
Optional gibt es **Refresh Tokens**:
- Länger gültig
- Dienen dazu, neue Access Tokens zu holen
- Können vom Authorization Server gezielt deaktiviert werden (z.B. bei Kompromittierung).
### 5.4 Single Sign-On / bessere User Experience (in Kombination mit OIDC)
In Kombination mit OIDC und Single-Sign-On-Konzepten:
- Benutzer loggt sich einmal beim zentralen Identity Provider ein.
- Mehrere Anwendungen können dann in einer Session auf Tokens zugreifen, ohne den Benutzer jedes Mal neu einzuloggen.
---
## 6. Typische OAuth-2-Flows (vereinfacht)
Es gibt verschiedene **„Flows“**, je nach Art des Clients und Nutzungsszenario. Die wichtigsten:
### 6.1 Authorization Code Flow (heute mit PKCE)
Typisch für:
- Web-Anwendungen mit Backend
- Single Page Applications (mit PKCE)
- Mobile Apps
Ablauf (vereinfacht, ohne technische Details):
1. Anwendung leitet Benutzer zum Authorization Server.
2. Benutzer loggt sich ein und stimmt zu.
3. Authorization Server schickt **Authorization Code** an die Anwendung (über Redirect).
4. Anwendung tauscht Code gegen ein **Access Token** (und optional Refresh Token).
**PKCE** (Proof Key for Code Exchange) ist eine Sicherheits-Erweiterung, um Code-Diebstahl zu verhindern, insbesondere bei mobilen/Browser-basierten Apps.
### 6.2 Client Credentials Flow
Für:
- Machine-to-Machine-Kommunikation (kein Benutzer)
- Hintergrundprozesse, Microservices, Server-zu-Server
Hier gibt es keinen Benutzer.
Der Client identifiziert sich selbst (z.B. mit Client ID + Client Secret) beim Authorization Server und bekommt ein Access Token, um auf eine API zuzugreifen.
**Beispiel**:
Ein Backend-Service ruft periodisch eine interne Unternehmens-API auf, um Daten zu synchronisieren.
### 6.3 Device Code Flow
Für Geräte ohne vollwertigen Browser oder ohne komfortable Eingabemöglichkeit, wie:
- Smart-TVs
- Konsolen
- IoT-Geräte
Ablauf:
- Gerät zeigt einen Code und eine URL an (z.B. „Bitte gehen Sie auf https://example.com/device und geben Sie Code ABCD ein“).
- Benutzer geht an seinem Smartphone/PC auf diese URL, loggt sich dort ein und bestätigt.
- Gerät bekommt anschließend ein Token und kann auf die Ressource zugreifen.
---
## 7. Herausforderungen und typische Stolperfallen
### 7.1 OAuth 2 ist komplex und flexibel
OAuth 2 ist sehr flexibel das ist Stärke und Schwäche zugleich:
- Viele Optionen & Erweiterungen → schnell unübersichtlich.
- Viele Entscheidungen zu treffen: Flows, Token-Formate, Scopes, Lifetimes, PKCE, etc.
Für Einsteiger wirkt es oft „überdimensioniert“, vor allem wenn man nur „einen einfachen Login“ braucht (wo eigentlich OIDC gefragt ist).
### 7.2 Verwechslung von OAuth 2 und Login
Weil viele große Anbieter beides kombiniert haben („Login mit Google“), entsteht oft:
- „OAuth 2 ist ein Login-Protokoll.“ → **Formal falsch**, es ist ein Autorisierungsframework.
- Für „Login“ verwendet man **OpenID Connect**, auch wenn technisch OAuth-2-Mechanismen verwendet werden.
Konsequenz:
Fehlkonzeptionen in Projekten, z.B. versucht man reine OAuth-2-Tokens zu nutzen, um Identität abzuleiten, statt OIDC zu verwenden.
### 7.3 Sicherheitsrisiken bei falscher Implementierung
Einige typische Fehler:
- **Tokens in URLs weitergeben** → landen in Logs, Browser-History, Referrer-Headern.
- **Implicit Flow** für Single-Page-Apps ohne ausreichende Sicherheitsmaßnahmen
→ gilt inzwischen als überholt; empfohlen wird Authorization Code Flow mit PKCE.
- **Keine Einschränkung der Redirect-URIs** → Angreifer können Redirect-URIs manipulieren und Tokens abfangen.
- **Zu lange gültige Tokens** → höheres Risiko bei Leaks.
- **Speichern von Tokens im unsicheren Speicher** (z.B. localStorage in Browsern) → anfällig für XSS.
### 7.4 Komplexität für Endnutzer
Auch für Endnutzer ist die Zustimmung manchmal nicht klar:
- „Diese App möchte auf Ihr Profil, Ihre Kontakte, Ihre Dateien, Ihre E-Mails zugreifen.“
→ Viele klicken aus Gewohnheit auf „Zulassen“, ohne zu verstehen, was das bedeutet.
Das ist eher ein UX-/Privacy-Thema, aber eng mit OAuth 2 verbunden, da die Darstellung der **Scopes** oft technisch und verwirrend ist.
---
## 8. Praxisnahe Beispiele
### Beispiel 1: „Mit Google anmelden“ in einer Web-App
**Situation**:
Du entwickelst eine Web-App, in der sich Nutzer anmelden können. Statt ein eigenes Benutzerkontensystem aufzubauen, willst du „Login mit Google“ anbieten.
**In Wahrheit passiert (typisch)**:
- Die App nutzt **OpenID Connect**:
- OAuth 2 regelt den Token-Flow.
- OIDC liefert ein ID Token mit Infos über den Benutzer.
- Nutzer sieht: Google-Login, eine Consent-Seite, und wird danach in deine App zurückgeleitet.
- Deine App bekommt:
- ein **ID Token** (zur Identifikation des Nutzers)
- ein **Access Token** (um z.B. zusätzlich auf Google APIs zuzugreifen, falls gewünscht).
**OAuth-2-Aspekt**:
Der eigentliche Mechanismus, wie Access Token ausgestellt werden, ist OAuth 2.
### Beispiel 2: Drittanbieter-Tool liest GitHub-Repositories
**Situation**:
Ein Build-Tool oder eine CI/CD-Plattform möchte deine privaten GitHub-Repositories lesen, um Builds auszulösen.
Ablauf:
1. In der CI/CD-Plattform klickst du „Mit GitHub verbinden“.
2. Du wirst zu GitHub weitergeleitet, loggst dich ein.
3. GitHub zeigt dir eine Seite:
„Tool X möchte Zugriff auf:
- Ihre öffentlichen und privaten Repositories
- Ihre Webhooks
…“
4. Du erlaubst.
5. Die CI/CD-Plattform erhält ein Access Token mit bestimmten **Scopes** (z.B. `repo`).
**OAuth-2-Aspekt**:
- Das Access Token erlaubt der CI/CD-Plattform, im Namen deines GitHub-Accounts zu agieren, innerhalb des erlaubten Scopes.
### Beispiel 3: Unternehmensinternes Microservice-System
**Situation**:
In einer Microservice-Architektur gibt es:
- einen zentralen Authorization Server (z.B. Keycloak, Auth0, Azure AD),
- viele Services, die interne APIs bereitstellen.
Szenario:
- Ein Frontend bekommt vom Authorization Server (über einen Login) ein Access Token.
- Dieses Access Token wird vom Frontend bei Aufrufen an das API-Gateway oder direkt an Microservices mitgeschickt.
- Microservices verifizieren das Token und entscheiden anhand von Scopes/Rollen, ob der Zugriff erlaubt ist.
**OAuth-2-Aspekt**:
- Zugriffskontrolle wird zentralisiert.
- Jeder Service muss nicht mehr selbst Benutzer verwalten, sondern nur Access Tokens prüfen.
---
## 9. Zusammenfassung in Stichpunkten
- **OAuth 2** ist ein **Autorisierungs-Framework** (nicht direkt ein Login-Protokoll).
- Es ermöglicht, dass **Drittanbieter-Apps im Namen eines Nutzers** auf Ressourcen zugreifen können, ohne das Passwort des Nutzers zu kennen.
- Wichtige Rollen: **Resource Owner**, **Client**, **Resource Server**, **Authorization Server**.
- Es arbeitet mit **Tokens** (Access Tokens, optional Refresh Tokens) und **Scopes** (feingranulare Rechte).
- Verwandte Standards:
- **OpenID Connect**: für Authentifizierung/Identität (baut auf OAuth 2 auf).
- **SAML**: alternative, ältere Lösung v.a. für SSO in Unternehmen.
- Es löst Probleme wie:
- Passwortweitergabe an Drittanbieter
- Fehlende Feingranularität von Zugriffsrechten
- Mangelnde Kontrolle über Zugriffsdelegation
- Herausforderungen:
- Komplexität und viele Optionen
- Verwechslungsgefahr mit Authentifizierung
- Sicherheitsrisiken bei falscher Implementierung
- UX/Verständlichkeit von Zustimmungsdialogen
- Praxis:
- „Mit Google/GitHub/Facebook anmelden“
- Drittanbieter-Apps, die auf APIs zugreifen
- Microservice-Systeme mit zentralem Identity & Access Management
---