Einführung in OAuth 2.0 und JWT in Swift
Moderne mobile und Desktop-Anwendungen in Swift (iOS/macOS) verwenden zunehmend das Protokoll OAuth 2.0 und das Format JWT (JSON Web Token) für sichere Autorisierung. OAuth 2.0 ermöglicht delegierten Zugriff auf Ressourcen, während JWT eine kompakte und sichere Übertragung von Benutzerdaten erlaubt. In diesem Artikel werden wir die vollständige Autorisierungskette in Swift implementieren: vom Token-Erhalt bis zur Überprüfung und Erneuerung.
Wir behandeln:
- Grundlagen von OAuth 2.0: Abläufe (Flows) und Rollen
- Struktur von JWT und dessen Dekodierung in Swift
- Praktische Implementierung der Autorisierung mit
URLSession - Speicherung von Tokens in der Schlüsselbund (Keychain) und deren Erneuerung
Grundlagen von OAuth 2.0 für Swift-Entwickler
OAuth 2.0 ist ein Autorisierungsprotokoll, das es einer Anwendung ermöglicht, eingeschränkten Zugriff auf Benutzerressourcen zu erhalten, ohne deren Anmeldedaten weiterzugeben. Im Kontext von Swift-Anwendungen wird am häufigsten der Authorization Code Flow mit PKCE (Proof Key for Code Exchange) für mobile Anwendungen verwendet.
Schlüsselkomponenten von OAuth 2.0
- Resource Owner — der Benutzer, Eigentümer der Daten
- Client — Ihre Swift-Anwendung
- Authorization Server — der Server, der Tokens ausstellt (z. B. Google, Facebook, Ihr Backend)
- Resource Server — die API, die geschützte Daten bereitstellt
Ein typischer Ablauf in Swift sieht so aus:
- Die Anwendung öffnet eine Web-Ansicht (SFSafariViewController oder ASWebAuthenticationSession) zur Benutzerauthentifizierung.
- Nach erfolgreichem Login leitet der Server auf eine Callback-URL mit einem temporären Code um.
- Die Anwendung tauscht den Code gegen einen Access Token und Refresh Token ein.
- Der Access Token wird für API-Anfragen verwendet, der Refresh Token zum Erhalten eines neuen Access Tokens bei Ablauf der Gültigkeit.
Struktur von JWT und dessen Dekodierung in Swift
JWT besteht aus drei Teilen, die durch Punkte getrennt sind: header.payload.signature. Beispiel eines JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikl2YW4gUGV0cm92IiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cDekodierung des Payloads in Swift (ohne Signaturprüfung):
import Foundation
struct JWT { static func decodePayload(_ token: String) -> [String: Any]? { let segments = token.components(separatedBy: ".") guard segments.count == 3 else { return nil } var base64 = segments[1] .replacingOccurrences(of: "-", with: "+") .replacingOccurrences(of: "_", with: "/") let length = Double(base64.lengthOfBytes(using: .utf8)) let requiredLength = 4 * ceil(length / 4.0) let padding = Int(requiredLength - length) if padding > 0 { base64 += String(repeating: "=", count: padding) } guard let data = Data(base64Encoded: base64) else { return nil } return try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] }}
// Verwendungif let payload = JWT.decodePayload("your.jwt.token") { print(payload["sub"] ?? "") print(payload["exp"] ?? "")}Für eine vollständige Signaturprüfung von JWT auf der Client-Seite verwenden Sie die Bibliothek SwiftJWT oder JWTDecode, die über den Swift Package Manager verfügbar sind.
Implementierung von OAuth 2.0 und JWT in Swift
Schritt 1: Einrichtung von URLSession und Token-Modellen
struct AuthToken: Codable { let accessToken: String let refreshToken: String? let expiresIn: Int let tokenType: String}
class AuthService { private let session = URLSession.shared