Biblioteca do cliente OAuth para Swift (iOS/macOS)
\n\nOAuth (Open Authorization) é um protocolo de autorização aberto que permite que aplicativos obtenham acesso limitado aos recursos do usuário sem transmitir seu login e senha. No ecossistema Apple (iOS, macOS, watchOS, tvOS), a implementação do OAuth 2.0 é o padrão para integração com serviços como Google, Facebook, GitHub, Twitter e muitos outros. Para desenvolvedores Swift, existem várias bibliotecas testadas que simplificam o processo de autenticação e gerenciamento de tokens.
\n\nNeste artigo, veremos uma das bibliotecas mais populares e flexíveis — OAuthSwift, e também discutiremos uma alternativa — AppAuth-iOS (recomendada pelo Google). Você aprenderá como conectar a biblioteca, realizar a autorização, obter o access token, refresh token e armazená-los com segurança.
\n\nPrincipais recursos do OAuthSwift
\n\n- \n
- Suporte a OAuth 1.0 e OAuth 2.0 \n
- Trabalho integrado com WebView (SFSafariViewController, WKWebView) \n
- Obtenção e atualização automática do access token \n
- Suporte a diferentes grants (Authorization Code, Implicit, Client Credentials, Resource Owner Password) \n
- Integração simples com Alamofire, URLSession e outros frameworks de rede \n
- Callbacks assíncronos (completion handlers) e suporte a Combine (através de extensões) \n
- Armazenamento seguro de tokens via Keychain \n
Instalação do OAuthSwift
\n\nA biblioteca é instalada via Swift Package Manager (SPM) ou CocoaPods. Exemplo para SPM:
\n\n// No Xcode: File → Add Packages...\n// URL: https://github.com/OAuthSwift/OAuthSwift.git\n// Versão: 2.2.0 ou superior\n\nOu via Package.swift:
dependencies: [\n .package(url: "https://github.com/OAuthSwift/OAuthSwift.git", from: "2.2.0")\n]\n\nExemplo de integração com OAuth 2.0 (Google)
\n\nVamos considerar um cenário típico — autorização via Google com obtenção do access token. Previamente, é necessário registrar o aplicativo no Google Cloud Console e obter o client_id e client_secret.
Passo 1. Configuração do URL scheme
\n\nNo arquivo Info.plist, adicione o esquema para o 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\nPasso 2. Código de autorização
\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// Salvamos a referência ao controlador para apresentar a 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 // Salvamos os tokens no 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("Erro de autorização: \\(error.localizedDescription)")\n