Table of Contents
Introducción a la autenticación biométrica en iOS
La autenticación biométrica se ha convertido en una piedra angular de la seguridad móvil moderna, ofreciendo un equilibrio entre comodidad y protección. Para los desarrolladores de iOS, el marco de Authentication Local proporciona una API sencilla pero potente para integrar la verificación de ID táctil, ID facial y contraseña de dispositivos en aplicaciones.Este artículo recorre el proceso completo de implementación de la autenticación biométrica usando LocalAuthentication, desde la configuración inicial hasta las mejores prácticas de producción, garantizando su privacidad y sus estándares más altos
Al final de esta guía, usted comprenderá cómo comprobar la disponibilidad biométrica, impulsar a los usuarios para la autenticación, manejar los errores con gracia y proporcionar mecanismos de retroceso, todo ello mientras se siguen las directrices de Apple para la privacidad del usuario y la protección de datos.
Comprender el Marco de Atenciones Locales
El marco de Authentication Local, introducido en iOS 8, proporciona una interfaz unificada para evaluar la identidad de usuario a través de biometría o un código de acceso de dispositivo. Se resumen las diferencias de hardware subyacentes entre Touch ID y Face ID, lo que le permite escribir lógica de autenticación que funciona perfectamente a través de todos los dispositivos iOS compatibles.
Los componentes clave del marco son:
- LAContext: El objeto central que gestiona las políticas de autenticación, las cadenas de razón localizadas y el comportamiento de retroceso.
- LAPolicía:] Políticas predefinidas que determinan el método de autenticación. Los dos más comunes son (biométrico solamente) y (biométrico con caída de contraseña).
- LAError: Códigos de error que informan a su aplicación por qué la autenticación no ha podido existir, el usuario canceló, no estableció contraseña y otros.
Si bien el marco es simple de usar, la aplicación adecuada requiere una atención cuidadosa a la experiencia de los usuarios, el manejo de errores y la seguridad. Vamos a explorar las opciones de política con más detalle.
Políticas de autenticación Explicadas
- – Si la biometría (Touch ID o Face ID) está inscrita y disponible, esta política sólo impulsa al usuario a la verificación biométrica. Si la biometría no está disponible, la evaluación de políticas falla sin ofrecer un inconveniente de contraseña. Esto es adecuado para operaciones de bajo riesgo donde usted desea una experiencia sin fricción y puede manejar la falta de biometría con gracia.
- – Esta política intenta primero la verificación biométrica. Si la biometría no está disponible, el usuario no registra la matrícula o el usuario cancela el impulso biométrico, su aplicación puede volver al código de acceso del dispositivo. Esta es la política recomendada para la mayoría de los escenarios de autenticación porque asegura que incluso cuando la biometría no es una opción, el usuario puede autenticar utilizando su código de paso.
Es importante señalar que el inconveniente de contraseña sólo aparece después de que el usuario cancele el impulso biométrico o si la biometría falla y el usuario pulsa “Enter Passcode”. Usted debe manejar estos eventos correctamente para evitar confundir al usuario.
Aplicación de medidas a medida
La aplicación de la autenticación biométrica implica cinco pasos claros: la importación del marco, la creación de una instancia , comprobando si la política deseada puede ser evaluada, realizando la evaluación y manejando el resultado.
1. Importar el marco
Comience por importar en cualquier archivo Swift donde se planea utilizar la autenticación. Esta importación le da acceso a , , y a todos los tipos de error.
import LocalAuthentication
2. Crear un LAContexto
es el objeto que consulta el estado del sistema y realiza la evaluación de autenticación. Puede configurar opcionalmente propiedades como el (el mensaje mostrado al usuario) y el (el texto para el botón desactivación). Por ejemplo, puede cambiar el título de desviamiento a "Use Passcode" en lugar de la "Enter Password".
let context = LAContext()
context.localizedFallbackTitle = "Use Passcode"
3. Consulta la disponibilidad biométrica
Antes de incitar al usuario, debe comprobar si la política elegida puede ser evaluada. Este cheque es esencial para evitar un fallo abrupto que podría confundir al usuario. Utilice el método , pasando la política que se pretende utilizar. El método devuelve un valor booleano. Si vuelve ], el parámetro ] [un puntero] no contiene la evaluación posible.
var error: NSError?
let canEvaluate = context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error)
if !canEvaluate {
// Handle the error – see section on error handling below
print("Authentication not available: \(error?.localizedDescription ?? "Unknown error")")
return
}
Las razones comunes para el fracaso incluyen: el dispositivo no admite biometría, no se inscriben huellas dactilares ni se inscribe la cara, el código de acceso del dispositivo no está establecido, o la aplicación no tiene derecho a la identificación facial (ver mejores prácticas).
4. Evaluar la política
Una vez que haya confirmado que la política puede ser evaluada, llame . El parámetro es una cadena que explica por qué su aplicación necesita autenticación. Esta cadena debe ser clara y fácil de usar porque se muestra en el sistema. Para Face ID, la razón siempre se muestra; para Touch ID, puede ser mostrada dependiendo de la configuración del dispositivo.
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "Authenticate to access your secure data") { success, evaluateError in
DispatchQueue.main.async {
if success {
// Authentication successful
print("User authenticated successfully")
} else {
// Authentication failed or was cancelled
print("Authentication failed: \(evaluateError?.localizedDescription ?? "Unknown error")")
}
}
}
Observe que el manipulador de terminación no está garantizado para ejecutar en el hilo principal. Siempre envíe actualizaciones de la interfaz de usuario y lógica posterior a la cola principal, como se muestra anteriormente.
5. Maneja el resultado
Cuando la autenticación tenga éxito, usted puede permitir el acceso con confianza a contenidos o acciones protegidos. Cuando falla, usted necesita determinar la causa al inspeccionar el . El error será de tipo , que es un enum conformándose a .
- .userCancel: El usuario se tapped "Cancel" en el impulso biométrico. Usted puede simplemente desestimar el flujo de inicio de sesión o la reingresación.
- .userFallback: The user tapped the fallback button (e.g., “Enter Password”). This triggers the passcode entry if using
.deviceOwnerAuthentication, but if you only used.deviceOwnerAuthenticationWithBiometrics, no fallback occurs. In that case, you should present your own passcode entry screen. - .biometryNotAvailable: Biometry is not available on this device (e.g., missing hardware). You should switch to passcode-only authentication.
- .biometryNotEnrolled: No biometric data is enrolled. Prompt the user to set up Touch ID or Face ID in Settings.
- .biometryLockout: Too many failed attempts; the system has locked biometry. You need to fall back to the passcode. The system passcode will reset the lockout.
- .passcodeNotSet: The device has no passcode configured. The user must set a passcode for biometry to work. Display an alert directing them to Settings.
Handling each of these cases gracefully is essential for a smooth user experience. For a production app, consider centralising your authentication logic in a manager class and providing clear feedback to the user.
Complete Example with Error Handling
Below is a more complete example that demonstrates a real-world authentication flow. It checks availability, handles errors with appropriate user alerts, and provides a fallback to a custom passcode entry if the user cancels biometry.
import LocalAuthentication
import UIKit
class BiometricAuthManager {
static let shared = BiometricAuthManager()
private let context = LAContext()
func authenticate(completion: @escaping (Bool, String?) -> Void) {
var error: NSError?
context.localizedFallbackTitle = "Use Passcode"
guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) else {
// Determine the reason why authentication is unavailable
let message = errorMessage(for: error)
completion(false, message)
return
}
// Possibly show a loading state
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: "Authenticate to access your account") { success, evaluateError in
DispatchQueue.main.async {
if success {
completion(true, nil)
} else {
let message = self.errorMessage(for: evaluateError as? LAError)
completion(false, message)
}
}
}
}
private func errorMessage(for error: LAError?) -> String {
guard let error = error else {
return "Authentication could not be completed."
}
switch error.code {
case .biometryNotAvailable:
return "Biometric authentication is not available on this device."
case .biometryNotEnrolled:
return "No biometric data is enrolled. Please set up Face ID or Touch ID in Settings."
case .biometryLockout:
return "Too many failed attempts. Please use your passcode to unlock biometrics."
case .passcodeNotSet:
return "A device passcode is required to use biometric authentication."
case .userCancel:
return "Authentication cancelled by user."
case .userFallback:
return "User chose to use the passcode."
default:
return "Authentication failed: \(error.localizedDescription)"
}
}
}
Esta clase encapsula la lógica de autenticación y devuelve un resultado de éxito/failure limpio con un mensaje fácil de usar. Sus controladores de vista pueden llamar y reaccionar en consecuencia.
Prácticas óptimas y consideraciones de producción
Si bien el código anterior proporciona una base sólida, varias prácticas adicionales asegurarán que su implementación sea robusta, segura y fácil de usar.
Siempre proporcionar un código de paso
Incluso si utiliza la política , debe tener su propia pantalla de entrada de código de paso lista. Muchos usuarios pueden no tener biometría inscrita o prefieren usar un código de paso en ciertas situaciones. Las Directrices de interfaz humana de Apple recomiendan ofrecer una alternativa clara a la biometría.
Use una razón localizada descriptiva
La cadena se muestra en el impulso del sistema. Esta cadena debe ser concisa y específica a la acción que el usuario está a punto de autorizar. Por ejemplo, “Regístrate a tu cuenta” es mejor que una vaga “Authentication required”. También localiza esta cadena para diferentes idiomas.
Respetar la privacidad del usuario
Nunca almacene los datos biométricos (plantas de identificación o mapas de cara) usted mismo. El sistema gestiona de forma segura estos datos en el Enclave Seguro. Su aplicación sólo recibe un resultado de éxito/fracaso booleano, no los datos biométricos reales. No trate de evitar esta separación.
Prueba sobre dispositivos reales
El simulador tiene capacidades de simulación biométricas limitadas. Siempre prueba Touch ID y Face ID en iPhones y iPads reales. Para Face ID, también debe incluir la clave en su ; de lo contrario, la aplicación se estrellará al intentar evaluar Face ID.
Maneja el ciclo de vida de la aplicación
Si su aplicación utiliza la autenticación biométrica para asegurar un estado de fondo, considere volver a autenticar cuando la aplicación regrese al primer plano. Puede observar y pedir autenticación de nuevo. Sin embargo, evite pedir la autenticación con demasiada frecuencia, un patrón común es requerir la reauténticación sólo después de un período de tiempo.
Combinar con llavero para seguridad más fuerte
La autenticación biométrica solo verifica la identidad del usuario en el momento del cheque. Para la seguridad persistente (por ejemplo, almacenamiento de fichas API), combinar biometría con la llave de llave. Usar la clase con las banderas o ] para asegurar que los secretos almacenados sólo puedan ser conectados después de actos biométricos o de validación.
Fallback después de la cerradura
Cuando la biometría está bloqueada debido a demasiados intentos fallidos, debe caer de nuevo al código de paso del dispositivo. La entrada de código de acceso del sistema se restablecerá automáticamente el bloqueo biométrico, por lo que después de una entrada exitosa de código de paso, futuros intentos biométricos funcionarán de nuevo. No trate de evitar esto; es una característica de seguridad para proteger contra ataques de fuerza bruta.
Diferencias entre el ID de contacto y el ID de cara
Aunque el marco de la autanización local abstrae la mayoría de las diferencias, hay algunos matices que deben tener en cuenta:
- El ID facial requiere un dispositivo con una cámara TrueDepth.] Usted debe comprobar después de llamar para determinar qué tipo biométrico está disponible. Esto le permite ajustar sus etiquetas de interfaz de usuario e iconos en consecuencia.
- El ID facial tiene mayor sensibilidad para viajar. El usuario debe mirar directamente al dispositivo. Asegúrese de que su explica por qué la aplicación necesita Face ID.
- Aspecto alternativo para Face ID: iOS 15.4 y luego permite a los usuarios configurar una apariencia alternativa (por ejemplo, con gafas o máscara). Su aplicación no necesita hacer nada especial; el sistema lo maneja automáticamente.
- Mantén pulsado con Face ID: Las versiones recientes de iOS soportan el desbloqueo con una máscara usando Apple Watch. Para la autenticación de nivel de aplicación, el indicador estándar Face ID todavía puede requerir el reconocimiento facial completo a menos que el usuario haya optado por usar máscara con Apple Watch.
Manejo de errores de la profundidad de la muleta
Cubrimos brevemente los errores comunes, pero vale la pena explicar cómo responder a cada uno de una manera fácil de usar.
| Error Code | User Feedback |
|---|---|
biometryNotAvailable | Show an alert: “Face ID / Touch ID is not available on this device. Please use your passcode.” Then offer your custom passcode screen. |
biometryNotEnrolled | Present an alert that directs the user to Settings > Face ID & Passcode (or Touch ID & Passcode). You can open Settings directly using UIApplication.openSettingsURLString. |
biometryLockout | Prompt the user to authenticate using the device passcode. The system passcode entry will reset the lockout. If you use the .deviceOwnerAuthentication policy, the system automatically handles the passcode prompt. If you used .deviceOwnerAuthenticationWithBiometrics, you must fall back to your own passcode entry or invoke the .deviceOwnerAuthentication policy again to trigger the system passcode UI. |
passcodeNotSet | Alert the user that a device passcode is required. Direct them to Settings to set one. You cannot continue until the passcode is configured. |
userCancel | Simply dismiss or return to the previous screen. Do not show an error; the user intentionally cancelled. |
userFallback | The user chose the fallback option. Present your own passcode entry screen (or rely on the system passcode if you used the combined policy). |
Rendimiento y Tracción
El método es asincrónico y no bloquea el hilo principal. Sin embargo, el manejador de la terminación puede ser llamado en un hilo de fondo. Siempre enviar actualizaciones de la interfaz de usuario a la cola principal. Además, evitar crear un nuevo para cada intento de autenticación; reutilizar una instancia si es posible, pero ser consciente de que el contexto puede volver a ser inválido después de un bloqueo biométrico.
Pruebas de autenticación biométrica
Puede simular la autenticación biométrica en el Simulador de iOS usando el menú Hardware. Para Touch ID, puede elegir “Touch ID” y luego “Matching Touch” o “No-matching Touch”. Para Face ID, el simulador le permite inscribir una cara y luego realizar intentos de emparejamiento o no de emparejamiento. Sin embargo, algunos escenarios (como bloqueo) no son simulados completamente.
Además, puede utilizar los planes de prueba de Xcode para escribir pruebas de unidad alrededor de su gestor de autenticación mediante la burla de la clase , siempre que diseñe su código con la inyección de dependencia. Esto le permite probar la lógica de manejo de errores sin depender de hardware real.
Recursos externos
Para mayor lectura y documentación oficial, consulte lo siguiente:
- Documentación de la Autoridad Local de Apple
- Referencia de clase de texto
- WDC 2017 – Building Apps with Face ID
- Servicios de la llave de clave y control de acceso biométrico
Conclusión
Implementar la autenticación biométrica con el marco de Authentication Local es un proceso sencillo que mejora significativamente la postura de seguridad de tu aplicación iOS manteniendo una experiencia de usuario fluida. Al comprobar la disponibilidad, manejar errores con gracia y proporcionar opciones confiables de retroceso, puedes construir un sistema de autenticación que respete la privacidad de los usuarios y cumpla con las estrictas directrices de Apple.
Recuerde que la autenticación biométrica es sólo una pieza de una estrategia de seguridad integral. Combinela con almacenamiento seguro a través de Keychain, seguridad de red y gestión de sesión adecuada para ofrecer a sus usuarios el nivel más alto de protección. Con el código y las mejores prácticas compartidas en este artículo, usted está bien equipado para integrar Touch ID y Face ID en su próximo proyecto iOS.