Autorización y autenticación en Swift (iOS/macOS)
La autorización y la autenticación son componentes clave de cualquier aplicación moderna. En el ecosistema de Apple (iOS/macOS), los desarrolladores tienen acceso a potentes frameworks y bibliotecas que simplifican estos procesos. En este artículo, exploraremos los enfoques principales, las bibliotecas populares y proporcionaremos ejemplos prácticos en Swift.
Conceptos básicos
Antes de pasar al código, es importante distinguir dos términos:
- Autenticación — verificación de la identidad del usuario (por ejemplo, usuario + contraseña, Face ID, Touch ID).
- Autorización — determinación de los derechos de acceso después de la autenticación (por ejemplo, si el usuario puede ver ciertos datos).
Capacidades integradas de Apple
1. LocalAuthentication (Face ID / Touch ID)
El framework LocalAuthentication permite utilizar los datos biométricos del dispositivo para la autenticación.
import LocalAuthentication
func authenticateWithBiometrics() { let context = LAContext() var error: NSError? // Verificamos si la biometría está disponible guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else { print("Biometría no disponible: \\(error?.localizedDescription ?? "error")") return } // Solicitamos autenticación context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Inicie sesión para acceder a la aplicación") { success, authError in DispatchQueue.main.async { if success { print("Autenticación exitosa") } else { print("Error: \\(authError?.localizedDescription ?? "error desconocido")") } } }}2. Keychain Services
Keychain es un almacenamiento seguro para contraseñas y tokens. Úselo para almacenar credenciales después de la autenticación.
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 ] // Eliminamos datos antiguos si existen SecItemDelete(query as CFDictionary) // Agregamos nuevos let status = SecItemAdd(query as CFDictionary, nil) if status == errSecSuccess { print("Datos guardados en Keychain") } else { print("Error al guardar: \\(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 autorización
1. Firebase Authentication
Firebase proporciona una solución lista para autenticación mediante email/contraseña, Google, Apple, Facebook y otros proveedores.
import FirebaseAuth
func signInWithEmail(email: String, password: String) { Auth.auth().signIn(withEmail: email, password: password) { result, error in if let error = error { print("Error al iniciar sesión: \\(error.localizedDescription)") return } print("Usuario inició sesión: \\(result?.user.uid ?? "ninguno")") } También en la biblioteca
Cliente Redis para Kotlin: Lettuce y Kreds — comparación y ejemplos
Serialización de objetos en Swift: Codable, NSCoding y JSONEncoder
Procesamiento de JSON en Rust: serde_json, simd-json, json5 y otras bibliotecas
Moq para C# (.NET): guía completa con ejemplos