Autorização e Autenticação em Swift (iOS/macOS)
Autorização e autenticação são componentes essenciais de qualquer aplicativo moderno. No ecossistema Apple (iOS/macOS), os desenvolvedores têm acesso a frameworks e bibliotecas poderosas que simplificam esses processos. Neste artigo, abordaremos as principais abordagens, bibliotecas populares e forneceremos exemplos práticos em Swift.
Conceitos Básicos
Antes de ir para o código, é importante distinguir dois termos:
- Autenticação — verificação da identidade do usuário (ex.: login + senha, Face ID, Touch ID).
- Autorização — determinação dos direitos de acesso após a autenticação (ex.: se o usuário pode visualizar determinados dados).
Recursos Nativos da Apple
1. LocalAuthentication (Face ID / Touch ID)
O framework LocalAuthentication permite usar dados biométricos do dispositivo para autenticação.
import LocalAuthentication
func authenticateWithBiometrics() { let context = LAContext() var error: NSError? // Verifica se a biometria está disponível guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { print("Biometria indisponível: \\(error?.localizedDescription ?? "erro")") return } // Solicita autenticação context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Entre para acessar o aplicativo") { success, authError in DispatchQueue.main.async { if success { print("Autenticação bem-sucedida") } else { print("Erro: \\(authError?.localizedDescription ?? "erro desconhecido")") } } }}2. Keychain Services
Keychain é um armazenamento seguro para senhas e tokens. Use-o para armazenar credenciais após a autenticação.
import Security
func saveToKeychain(service: String, account: String, password: String) { guard let passwordData = password.data(using: .utf8) else { return } let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: service, kSecAttrAccount as String: account, kSecValueData as String: passwordData ] // Remove dados antigos, se houver SecItemDelete(query as CFDictionary) // Adiciona novos dados let status = SecItemAdd(query as CFDictionary, nil) if status == errSecSuccess { print("Dados salvos no Keychain") } else { print("Erro ao salvar: \\(status)") }}
func readFromKeychain(service: String, account: String) -> String? { let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: service, kSecAttrAccount as String: account, kSecReturnData as String: true, kSecMatchLimit as String: kSecMatchLimitOne ] var item: CFTypeRef? let status = SecItemCopyMatching(query as CFDictionary, &item) guard status == errSecSuccess, let data = item as? Data else { return nil } return String(data: data, encoding: .utf8)}Bibliotecas Populares para Autorização
1. Firebase Authentication
O Firebase fornece uma solução pronta para autenticação via email/senha, Google, Apple, Facebook e outros provedores.
import FirebaseAuth
func signInWithEmail(email: String, password: String) { Auth.auth().signIn(withEmail: email, password: password) { result, error in if let error = error { print("Erro ao entrar: \\(error.localizedDescription)") return } print("Usuário entrou: \\(result?.user.uid ?? "nenhum")") } Também na biblioteca
Rate Limiting em C# (.NET): Guia Completo da Biblioteca System.Threading.RateLimiting
ORM para Rust: comparação entre Diesel, SeaORM, SQLx e exemplos de código
ORM para Kotlin: Exposed vs Ktor vs Ktorm — comparação e exemplos
Detekt para Kotlin: guia completo com exemplos