Einführung in OAuth 2.0 und JWT in Swift
\n\nModerne mobile und Desktop-Anwendungen kommen selten ohne Authentifizierung aus. Zwei Schlüsselprotokolle – OAuth 2.0 und JWT (JSON Web Token) – sind zum De-facto-Standard für die sichere Datenübertragung zwischen Client und Server geworden. In diesem Artikel werden wir untersuchen, wie man OAuth 2.0 und JWT-Autorisierung in Swift für die Plattformen iOS und macOS implementiert. Sie erfahren, wie Sie den Token-Abrufablauf einrichten, Token sicher in der Keychain speichern und sie bei Ablauf automatisch erneuern.
\n\nDer Artikel richtet sich an Anfänger-Entwickler, die bereits mit den Grundlagen von Swift und SwiftUI vertraut sind. Wir verwenden URLSession für Netzwerkanfragen und Keychain für die sichere Datenspeicherung. Der Code ist in Swift 5.9 geschrieben und kompatibel mit iOS 15+ / macOS 12+.
\n\nWas sind OAuth 2.0 und JWT?
\n\nBevor wir Code schreiben, lassen Sie uns die Theorie verstehen.
\n\nOAuth 2.0
\nOAuth 2.0 ist ein Autorisierungsprotokoll, das es einer Anwendung ermöglicht, eingeschränkten Zugriff auf die Ressourcen eines Benutzers zu erhalten, ohne dessen Benutzernamen und Passwort weiterzugeben. Stattdessen werden Zugriffstoken verwendet. Die Hauptakteure sind:
\n- \n
- Resource Owner – der Benutzer. \n
- Client – Ihre Anwendung. \n
- Authorization Server – der Server, der Token ausstellt. \n
- Resource Server – die API, die Daten bereitstellt. \n
Der beliebteste Ablauf für mobile Anwendungen ist der Authorization Code Flow with PKCE (Proof Key for Code Exchange). Er ist auch ohne Client Secret sicher, das in einer Anwendung schwer zu speichern ist.
\n\nJWT (JSON Web Token)
\nJWT ist ein kompaktes und eigenständiges Token-Format, das JSON-Daten enthält. Es besteht aus drei Teilen, die durch Punkte getrennt sind:
\n- \n
- Header – Tokentyp und Signaturalgorithmus. \n
- Payload – Nutzdaten (Claims), wie Benutzer-ID, Rolle, Ablaufdatum. \n
- Signature – Signatur zur Überprüfung der Integrität. \n
JWT wird häufig als Access Token in OAuth 2.0 verwendet. Es ermöglicht dem Server, die Authentizität einer Anfrage zu überprüfen, ohne auf eine Datenbank zugreifen zu müssen.
\n\nPraktische Implementierung in Swift
\n\nWir erstellen eine einfache Klasse AuthService, die die Authentifizierung verwaltet. Als Beispiel verwenden wir den Server https://api.example.com.
Schritt 1: Token über OAuth 2.0 abrufen
\n\nZunächst implementieren wir eine Methode zum Abrufen von Token mithilfe eines Autorisierungscodes. Angenommen, wir haben den authorizationCode bereits über eine Web-View (z. B. ASWebAuthenticationSession) erhalten.
import Foundation\n\nfinal class AuthService {\n static let shared = AuthService()\n private let baseURL = "https://api.example.com"\n private let clientID = "your_client_id"\n private let redirectURI = "yourapp://callback"\n \n // MARK: - Token abrufen\n func exchangeCodeForTokens(code: String, codeVerifier: String) async throws -> TokenResponse {\n let url = URL(string: "\\(baseURL)/oauth/token")!\n var request = URLRequest(url: url)\n request.httpMethod = "POST"\n request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")\n \n let body = [\n "grant_type": "authorization_code",\n "code": code,\n "redirect_uri": redirectURI,\n "client_id": clientID,\n "code_verifier": codeVerifier\n ]\n .map { "\\($0.key)=\\($0.value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")" }\n .joined(separator: "&")\n .data(using: .utf8)\n \n request.httpBody = body\n \n let (data, response) = try await URLSession.shared.data(for: request)\n \n guard let httpResponse = response as? HTTPURLResponse,