OAuth2 Authentifizierung Erklaert
OAuth 2.0: Authentifizierung einfach erklärt
OAuth 2.0 ist der Standard für sichere API-Autorisierung. "Mit Google anmelden", "Mit GitHub anmelden" – das ist OAuth. Dieser Guide erklärt die Konzepte.
Was ist OAuth 2.0?
OAuth 2.0 ist ein Autorisierungsframework, das einer Anwendung erlaubt, im Namen eines Benutzers auf Ressourcen zuzugreifen – ohne dass der Benutzer sein Passwort teilen muss.
Beteiligte Parteien
| Rolle | Beschreibung | Beispiel |
|---|---|---|
| Resource Owner | Der Benutzer | Sie |
| Client | Die Anwendung | Eine App die Ihre GitHub-Repos lesen will |
| Authorization Server | Authentifiziert und gibt Tokens aus | GitHub Login |
| Resource Server | API mit den geschützten Daten | GitHub API |
OAuth vs. Andere Methoden
| Methode | Verwendung |
|---|---|
| OAuth 2.0 | Autorisierung (Zugriff auf Ressourcen) |
| OpenID Connect | Authentifizierung (Identität) auf OAuth 2.0 aufgebaut |
| API Keys | Einfache Server-zu-Server Authentifizierung |
| JWT | Token-Format (kann mit OAuth verwendet werden) |
Grant Types (Flows)
1. Authorization Code Flow (empfohlen)
Für Server-side Anwendungen. Sicherster Flow.
1. User klickt "Mit GitHub anmelden"
2. Redirect zu GitHub Login
3. User gibt Zugangsdaten ein
4. GitHub redirected zurück mit Code
5. Server tauscht Code gegen Access Token
6. Server nutzt Token für API-Calls
┌──────────┐ ┌─────────────┐ ┌────────────┐
│ Client │ │ GitHub │ │ GitHub │
│ (App) │ │ (Auth) │ │ (API) │
└────┬─────┘ └──────┬──────┘ └──────┬─────┘
│ │ │
│ 1. Redirect mit │ │
│ client_id, scope │ │
│──────────────────────>│ │
│ │ │
│ 2. User Login │ │
│ │ │
│ 3. Redirect mit Code │ │
│<──────────────────────│ │
│ │ │
│ 4. Code + Secret │ │
│──────────────────────>│ │
│ │ │
│ 5. Access Token │ │
│<──────────────────────│ │
│ │ │
│ 6. API Request mit Token │
│───────────────────────────────────────────────>│
│ │ │
│ 7. Daten │ │
│<───────────────────────────────────────────────│
Authorization Request
GET https://github.com/login/oauth/authorize? response_type=code &client_id=YOUR_CLIENT_ID &redirect_uri=https://yourapp.com/callback &scope=read:user%20repo &state=random_string
Token Request
POST https://github.com/login/oauth/access_token Content-Type: application/x-www-form-urlencoded grant_type=authorization_code &code=AUTHORIZATION_CODE &redirect_uri=https://yourapp.com/callback &client_id=YOUR_CLIENT_ID &client_secret=YOUR_CLIENT_SECRET
Token Response
{
"access_token": "gho_xxxxxxxxxxxx",
"token_type": "Bearer",
"scope": "read:user,repo",
"expires_in": 3600
}
2. Authorization Code Flow mit PKCE
Für Mobile Apps und SPAs. Kein Client Secret nötig.
// 1. Code Verifier generieren const codeVerifier = generateRandomString(128); // 2. Code Challenge berechnen const codeChallenge = base64url(sha256(codeVerifier)); // 3. Auth Request mit Challenge /authorize? ... &code_challenge=CHALLENGE &code_challenge_method=S256 // 4. Token Request mit Verifier grant_type=authorization_code &code=CODE &code_verifier=VERIFIER
3. Client Credentials Flow
Für Server-zu-Server Kommunikation (kein User involviert).
POST /oauth/token Content-Type: application/x-www-form-urlencoded grant_type=client_credentials &client_id=YOUR_CLIENT_ID &client_secret=YOUR_CLIENT_SECRET &scope=read:data
Access Token verwenden
// API-Anfrage mit Bearer Token GET https://api.github.com/user Authorization: Bearer gho_xxxxxxxxxxxx
Refresh Tokens
Access Tokens sind kurzlebig. Refresh Tokens erneuern sie:
POST /oauth/token Content-Type: application/x-www-form-urlencoded grant_type=refresh_token &refresh_token=REFRESH_TOKEN &client_id=YOUR_CLIENT_ID &client_secret=YOUR_CLIENT_SECRET
Scopes
Scopes begrenzen, was die App tun darf:
# Nur Profil lesen scope=read:user # Repos lesen scope=read:user repo # Mehrere Scopes (Leerzeichen oder Komma) scope=read:user,repo:status,gist
Implementation mit Node.js
const express = require('express');
const axios = require('axios');
const CLIENT_ID = process.env.GITHUB_CLIENT_ID;
const CLIENT_SECRET = process.env.GITHUB_CLIENT_SECRET;
const REDIRECT_URI = 'http://localhost:3000/callback';
// 1. Login starten
app.get('/login', (req, res) => {
const authUrl = `https://github.com/login/oauth/authorize?` +
`client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&scope=read:user`;
res.redirect(authUrl);
});
// 2. Callback verarbeiten
app.get('/callback', async (req, res) => {
const { code } = req.query;
// Code gegen Token tauschen
const tokenResponse = await axios.post(
'https://github.com/login/oauth/access_token',
{
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
code,
redirect_uri: REDIRECT_URI
},
{ headers: { Accept: 'application/json' } }
);
const accessToken = tokenResponse.data.access_token;
// 3. API-Anfrage
const userResponse = await axios.get('https://api.github.com/user', {
headers: { Authorization: `Bearer ${accessToken}` }
});
res.json(userResponse.data);
});
Sicherheits-Best-Practices
- State-Parameter nutzen gegen CSRF
- PKCE für SPAs/Mobile (kein Secret möglich)
- HTTPS immer
- Tokens sicher speichern (nicht in localStorage!)
- Minimale Scopes anfordern
- Token-Rotation implementieren