OAuth-Client für Swift (iOS/macOS): Vollständige Anleitung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Bibliothek des OAuth-Clients für Swift (iOS/macOS)

\n\n

OAuth (Open Authorization) ist ein offenes Autorisierungsprotokoll, das es Anwendungen ermöglicht, eingeschränkten Zugriff auf Benutzerressourcen zu erhalten, ohne deren Login und Passwort zu übertragen. Im Apple-Ökosystem (iOS, macOS, watchOS, tvOS) ist die Implementierung von OAuth 2.0 der Standard für die Integration mit Diensten wie Google, Facebook, GitHub, Twitter und vielen anderen. Für Swift-Entwickler gibt es mehrere bewährte Bibliotheken, die den Authentifizierungsprozess und die Token-Verwaltung vereinfachen.

\n\n

In diesem Artikel betrachten wir eine der beliebtesten und flexibelsten Bibliotheken – OAuthSwift – und besprechen eine Alternative – AppAuth-iOS (von Google empfohlen). Sie erfahren, wie Sie die Bibliothek einbinden, eine Autorisierung durchführen, ein Access-Token, ein Refresh-Token erhalten und diese sicher speichern.

\n\n

Hauptfunktionen von OAuthSwift

\n\n
    \n
  • Unterstützung von OAuth 1.0 und OAuth 2.0
  • \n
  • Integrierte Arbeit mit WebView (SFSafariViewController, WKWebView)
  • \n
  • Automatisches Abrufen und Aktualisieren von Access-Tokens
  • \n
  • Unterstützung verschiedener Grant-Typen (Authorization Code, Implicit, Client Credentials, Resource Owner Password)
  • \n
  • Einfache Integration mit Alamofire, URLSession und anderen Netzwerk-Frameworks
  • \n
  • Asynchrone Callbacks (Completion Handler) und Unterstützung von Combine (über Erweiterungen)
  • \n
  • Sichere Speicherung von Tokens über Keychain
  • \n
\n\n

Installation von OAuthSwift

\n\n

Die Bibliothek wird über Swift Package Manager (SPM) oder CocoaPods installiert. Beispiel für SPM:

\n\n
// In Xcode: File → Add Packages...\n// URL: https://github.com/OAuthSwift/OAuthSwift.git\n// Version: ab 2.2.0
\n\n

Oder über Package.swift:

\n\n
dependencies: [\n    .package(url: "https://github.com/OAuthSwift/OAuthSwift.git", from: "2.2.0")\n]
\n\n

Integrationsbeispiel mit OAuth 2.0 (Google)

\n\n

Betrachten wir ein typisches Szenario – die Autorisierung über Google mit Erhalt eines Access-Tokens. Zuvor muss die Anwendung in der Google Cloud Console registriert werden, um client_id und client_secret zu erhalten.

\n\n

Schritt 1. Konfiguration des URL-Schemas

\n\n

Fügen Sie in der Datei Info.plist ein Schema für den Rückruf hinzu:

\n\n
<key>CFBundleURLTypes</key>\n<array>\n    <dict>\n        <key>CFBundleURLSchemes</key>\n        <array>\n            <string>com.googleusercontent.apps.YOUR_CLIENT_ID</string>\n        </array>\n    </dict>\n</array>
\n\n

Schritt 2. Autorisierungscode

\n\n
import OAuthSwift\n\nlet oauthswift = OAuth2Swift(\n    consumerKey:    "YOUR_CLIENT_ID",\n    consumerSecret: "YOUR_CLIENT_SECRET",\n    authorizeUrl:   "https://accounts.google.com/o/oauth2/auth",\n    accessTokenUrl: "https://oauth2.googleapis.com/token",\n    responseType:   "code"\n)\n\n// Speichern einer Referenz auf den ViewController zur Präsentation der WebView\nlet handler = SafariURLHandler(viewController: self, oauthSwift: oauthswift)\noauthswift.authorizeURLHandler = handler\n\nlet state = generateState(withLength: 20)\noauthswift.authorize(\n    withCallbackURL: URL(string: "com.googleusercontent.apps.YOUR_CLIENT_ID:/oauth2callback")!,\n    scope: "https://www.googleapis.com/auth/userinfo.email",\n    state: state,\n    parameters: [:]) { result in\n    switch result {\n    case .success(let (credential, response, parameters)):\n        print("Access Token: \\(credential.oauthToken)")\n        print("Refresh Token: \\(credential.oauthRefreshToken)")\n        // Tokens in der Keychain speichern\n        KeychainWrapper.standard.set(credential.oauthToken, forKey: "access_token")\n        KeychainWrapper.standard.set(credential.oauthRefreshToken, forKey: "refresh_token")\n    case .failure(let error):\n        print("Autorisierungsfehler: \\(error.localizedDescription)")\n                    

Empfehlungen