Bibliothèque client OAuth pour Swift (iOS/macOS)
\n\nOAuth (Open Authorization) est un protocole d'autorisation ouvert qui permet aux applications d'obtenir un accès limité aux ressources d'un utilisateur sans transmettre son identifiant et son mot de passe. Dans l'écosystème Apple (iOS, macOS, watchOS, tvOS), l'implémentation d'OAuth 2.0 est la norme pour l'intégration avec des services tels que Google, Facebook, GitHub, Twitter et bien d'autres. Pour les développeurs Swift, il existe plusieurs bibliothèques éprouvées qui simplifient le processus d'authentification et de gestion des jetons.
\n\nDans cet article, nous examinerons l'une des bibliothèques les plus populaires et flexibles — OAuthSwift, ainsi qu'une alternative — AppAuth-iOS (recommandée par Google). Vous apprendrez comment connecter la bibliothèque, effectuer l'autorisation, obtenir un access token, un refresh token et les stocker en toute sécurité.
\n\nFonctionnalités principales d'OAuthSwift
\n\n- \n
- Prise en charge d'OAuth 1.0 et OAuth 2.0 \n
- Travail intégré avec WebView (SFSafariViewController, WKWebView) \n
- Obtention et mise à jour automatiques de l'access token \n
- Prise en charge de différents grants (Authorization Code, Implicit, Client Credentials, Resource Owner Password) \n
- Intégration simple avec Alamofire, URLSession et d'autres frameworks réseau \n
- Callbacks asynchrones (completion handlers) et prise en charge de Combine (via des extensions) \n
- Stockage sécurisé des jetons via Keychain \n
Installation d'OAuthSwift
\n\nLa bibliothèque s'installe via Swift Package Manager (SPM) ou CocoaPods. Exemple pour SPM :
\n\n// Dans Xcode : File → Add Packages...\n// URL : https://github.com/OAuthSwift/OAuthSwift.git\n// Version : à partir de 2.2.0\n\nOu via Package.swift :
dependencies: [\n .package(url: "https://github.com/OAuthSwift/OAuthSwift.git", from: "2.2.0")\n]\n\nExemple d'intégration avec OAuth 2.0 (Google)
\n\nConsidérons un scénario typique — l'autorisation via Google avec obtention d'un access token. Au préalable, il est nécessaire d'enregistrer l'application dans Google Cloud Console et d'obtenir client_id et client_secret.
Étape 1. Configuration du URL scheme
\n\nDans le fichier Info.plist, ajoutez le schéma pour le callback :
<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Étape 2. Code d'autorisation
\n\nimport 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// Sauvegarder la référence au contrôleur pour la présentation de 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 // Sauvegarder les jetons dans Keychain\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("Erreur d'autorisation : \\(error.localizedDescription)")\n