Einleitung: Warum ist Autorisierung in mobilen Apps notwendig?
Moderne iOS-Apps arbeiten selten isoliert. Sie kommunizieren mit Servern, senden Daten, erhalten personalisierte Inhalte. Aber wie kann der Server erkennen, dass die Anfrage tatsächlich von dem Benutzer stammt, der er vorgibt zu sein? Hier kommen OAuth 2.0 und JWT (JSON Web Token) ins Spiel. Dies sind nicht nur modische Abkürzungen, sondern Sicherheitsstandards, die der Funktionsweise der meisten modernen APIs (Google, Facebook, GitHub, Ihr eigenes Backend) zugrunde liegen.
In diesem Artikel werden wir untersuchen, wie OAuth 2.0 und JWT in Swift funktionieren. Sie erfahren, worin sie sich unterscheiden, wie man sie richtig implementiert und welche Fallstricke auf Anfänger warten. Wir werden Code zum Abrufen, Speichern und Aktualisieren von Token schreiben. Los geht's!
1. Grundlagen: OAuth 2.0 und JWT – worin liegt der Unterschied?
Viele verwechseln diese beiden Konzepte. Tatsächlich handelt es sich um unterschiedliche Abstraktionsebenen.
- OAuth 2.0 ist ein Autorisierungsprotokoll. Es beschreibt, wie eine App (Client) auf die Ressourcen eines Benutzers auf einem Drittanbieter-Server (z. B. auf seine Fotos bei Google) zugreifen kann, ohne Login und Passwort zu übertragen. Die Hauptidee ist die Ausgabe temporärer Zugriffstoken.
- JWT ist ein Token-Format. Es ist ein kompakter, URL-sicherer String, der JSON-Daten (z. B. Benutzer-ID, Rolle, Gültigkeitsdauer) und eine Signatur enthält. JWT wird häufig als Access Token in OAuth 2.0 verwendet, kann aber auch separat eingesetzt werden.
Eine einfache Analogie: OAuth 2.0 sind die Regeln für die Ausstellung eines Stadionausweises, und JWT ist der Plastikausweis selbst mit Ihrem Foto und Stempel.
In einem typischen Szenario einer iOS-App:
- Öffnet einen Browser für die Anmeldung über einen OAuth-Anbieter (Google, Apple ID, eigener Server).
- Erhält einen Authorization Code.
- Tauscht den Code gegen einen Access Token (oft im JWT-Format) und einen Refresh Token ein.
- Verwendet den Access Token für API-Anfragen.
- Wenn der Access Token abläuft, verwendet er den Refresh Token, um einen neuen zu erhalten.
2. Struktur eines JWT-Tokens
Ein JWT besteht aus drei Teilen, die durch Punkte getrennt sind:
header.payload.signatureBeispiel eines dekodierten JWT:
// Header (Kopfzeile){ "alg": "HS256", "typ": "JWT"}// Payload (Nutzlast){ "sub": "1234567890", "name": "Ivan Petrov", "iat": 1516239022, "exp": 1516242622}// Signature (Signatur) - wird vom Server erstelltWichtig: Der Payload eines JWT ist nicht verschlüsselt, er ist nur Base64-kodiert. Jeder kann ihn lesen. Die Geheimhaltung wird durch die Signatur gewährleistet – wenn der Server sieht, dass die Signatur nicht übereinstimmt, lehnt er das Token ab. Speichern Sie daher niemals Passwörter oder geheime Daten in einem JWT.
3. Implementierung von OAuth 2.0 und JWT in Swift
Kommen wir nun zur Praxis. Wir werden eine Klasse für die Arbeit mit der Autorisierung schreiben. Der Einfachheit halber verwenden wir die eingebaute URLSession, obwohl in realen Projekten oft Alamofire oder SwiftUI + async/await verwendet werden.
3.1. Datenmodelle
struct AuthResponse: Codable { let accessToken: String let refreshToken: String? let expiresIn: Int enum CodingKeys: String, CodingKey { case accessToken = "access_token" case refreshToken = "refresh_token" case expiresIn = "expires_in" }}
struct UserProfile: Codable { let id: String let name: String let email: String}3.2. Autorisierungsdienst
Erstellen wir eine Klasse AuthService, die für das Abrufen und Aktualisieren von Token zuständig ist. Beachten Sie: In einer echten App sollten URL und clientSecret sicher gespeichert werden (z. B. im Keychain oder über einen Konfigurationsserver).
class AuthService { static let shared = A