Home » Guías » Guía paso a paso: integrando autenticación con TouchID
Guía TouchID

Guía paso a paso: integrando autenticación con TouchID

TouchID es uno de esos grandes inventos que incorporó Apple a sus dispositivos, que al final se ha convertido en uno de los elementos más apreciados por los usuarios. El desbloqueo del iPhone o el iPad es fácil, intuitivo y funciona a la perfección en un altísimo porcentaje de veces dejando sus “Inténtelo de nuevo” en algo anecdótico.

Y una de las grandes cosas que incorporó Apple en el nuevo iOS 8 fue la posibilidad de usar TouchID como seguridad para nuestras propias apps. De esta forma, en vez de pedir un usuario y contraseña determinado, podemos hacer uso de la huella.

Las buenas prácticas en seguridad, no obstante, recomiendan que el primer acceso a nuestra app tras un reinicio del terminal obligue al uso de la forma tradicional de acceso (usuario y contraseña) con el fin de asegurar que el uso de la huella queda activado tras esto. Es un paso más a nivel de seguridad.

Una pequeña app de ejemplo

Para entender y seguir bien esta guía, es imprescindible que sepáis cómo crear una app básica. Si no sabéis, os invito a seguir la primera lección de nuestro curso de apps donde aprenderéis todo lo necesario para hacer lo que se explica en esta guía.

Abrimos Xcode, elegimos crear un nuevo proyecto en iOS, subopción Application y elegimos Single View Application. Le damos como nombre TouchID Test, elegimos el lenguaje que queremos usar (Swift u Objective-C) y en Devices lo dejamos en Universal.

Abrimos la carpeta con el nombre que hemos dado a nuestra app y pulsamos en Main.storyboard. Arrastramos dos text field de la librería de objetos, ponemos como Placeholder text los valores Usuario y Contraseña y les damos alineación central de posición y contenido. Es muy importante que no olvidemos marcar Secure Text Entry en el campo Contraseña en el inspector de atributos. Ponemos también un par de labels centrados para indicar al usuario qué es cada campo.

Cogemos dos botones, y los ponemos debajo: uno con la etiqueta Entrar que serviría para validar el binomio usuario y contraseña (esta implementación la dejamos a vuestra elección) y un segundo con la etiqueta Huella que activará la validación por TouchID.

Ya hemos creado una interfaz tosca y básica, pues lo que nos interesa aquí es la funcionalidad de TouchID. Definida esta nos quedaría algo como lo que veis bajo estas líneas, constraints del auto layout del storyboard incluidas (que se verán próximamente en el curso de apps).

Interfaz Proyecto TouchID

Una vez creada la interfaz, nos vamos al proyecto en la parte alta del navegador y veremos en la zona central la información de nuestra app. Debe estar elegido el target TouchID Test Swift y arriba seleccionado General. Nos vamos abajo del todo en Linked Frameworks and Libraries que presumiblemente estará vacío, y pulsamos el +.

En la ventana emergente buscamos la librería, LocalAuthentication.framework y le damos a Add para añadirla a nuestro proyecto. En ella está la implementación de TouchID.

Local Authentication Framework

Nos vamos a ViewController y añadimos el import de esta librería, ya sea en Swift u Objective-C, con el fin de poder usar las implementaciones.

  • Swift
  • Objective-C

Lo primero a tener en cuenta es que para usar la huella tiene que haber tres cosas presentes en el dispositivo: la primera que tenga lector de huella (obviamente), la segunda que haya un passcode o clave registrada y la última que exista al menos una huella registrada. Si no se dan estas, el código devolverá un error que no permitirá el uso de TouchID y nos limitaremos a usar el usuario y contraseña convencional.

Para comprobar si podemos o no usar la huella, hay que usar el método canEvaluatePolicy de una variable de contexto de autenticación local del tipo LAContext, que hará las veces de objeto para toda nuestra implementación.

  • Swift
  • Objective-C

En principio es así de sencillo comprobar si podemos o no acceder a la funcionalidad de la huella. Luego, lo único que hemos de hacer es acceder al método evaluatePolicy del contexto, pasando como argumento el valor DeviceOwnerAuthenticationWithBiometrics dentro del tipo LAPolicy, así como un mensaje que se mostrará en la alerta que justifique la petición de esta (la razón).

El proceso de validación es asíncrono, por lo que la respuesta a la llamada ha de ser un bloque o un closure (dependiendo si es Objective-C o Swift) donde hagamos la funcionalidad y comprobaciones necesarias que se ejecutarán una vez se haya o no validado la huella, es decir, una vez el usuario haya interactuado con la ventana emergente y realizado alguna acción que de por finalizada la funcionalidad.

  • Swift
  • Objective-C

Integrando en la app

Vamos a crear una acción para el botón Entrar dentro de nuestro viewController y otra para el botón Huella. Las llamaremos, respectivamente, quieroClave y quieroHuella. De igual forma, creamos dos outlets, uno para cada campo usuario y contraseña. Recordamos que hay que acceder al editor asistente, pulsar el elemento con la tecla CTRL pulsada y sin soltar arrastrar al código.

Realmente no es necesario incluir la funcionalidad de usuario y contraseña, y de hecho, no vamos a hacerlo para que seáis vosotros quienes terminéis el proyecto completamente. Pero la idea es que hagamos una llamada a una función showOK que nos permita ver que hemos pasado la validación (con una alerta, por ejemplo), y se haga tanto desde la introducción de los valores correctos de usuario y contraseña, como desde la identificación correcta de la huella.

No obstante, solo con el botón Huella veremos que la implementación ya funciona por sí sola. Lo que sí vamos a hacer es tener en cuenta los errores posibles que pueda dar. Los más importantes serían los siguientes.

  • LAError.UserCancel: el usuario ha pulsado la tecla cancelar antes de validar la huella, aunque el dispositivo estaba preparado para validarla.
  • LAError.UserFallback: el usuario ha pulsado en “Introducir contraseña” o en la parte donde le permite quitar el diálogo de huella y validarse con otro medio que no sea la huella. Lo que se conoce como fallback del usuario.
  • LAError.SystemCancel: el sistema ha cancelado la validación por algún motivo (por ejemplo, entra una llamada en ese momento).

Aparte de estos errores o estados de funcionamiento, tenemos otros que también podemos controlar y que corresponden a la parte que valida si podemos o no usar el lector de huellas:

  • LAError.TouchIDNotEnrolled: El dispositivo dispone de lector TouchID pero no hay ninguna huella aun registrada.
  • LAError.PasscodeNotSet: El dispositivo no tiene activado un passcode que a su vez permita activar la función de identificación del TouchID.

A partir de la variable de la propiedad code del tipo NSError que enviamos al método evaluatePolicy del contexto de autenticación, podemos saber los valores y errores traducidos que pueda dar, al igual que al llamar al método canEvaluatePolicy.

Así que vamos a cambiar nuestra función sePuedeUsarHuella, incluyendo el control de errores:

  • Swift
  • Objective-C

Y ahora, hacemos lo propio con comprobarHuella, implementando también un switch que nos permita validar los posibles errores generales que podamos tener:

  • Swift
  • Objective-C

Listo. Ahora que tenemos las dos partes imprescindibles de la comprobación, modificamos el código de nuestra función de acción para que haga lo propio.

  • Swift
  • Objective-C

Ya tendríamos nuestra comprobación. Solo tenemos que crear un par de alertas en dos funciones showOK y showNOOK o hacer que esas funciones den la funcionalidad que queramos conseguir cuando se obtiene una correcta validación.

Como pequeño apunte o truco, podemos personalizar el mensaje de fallback del usuario por el que este elige el método tradicional en vez de usar la huella, una vez tiene el diálogo frente a él. La forma de hacerlo es usando la propiedad localizedFallbackTitle de la variable que tiene el contexto. Por ejemplo, vamos a suponer que en vez de “Introducir la contraseña” queremos que ponga “Usar PIN”. Solo tenemos que cambiar esta propiedad en la línea siguiente a haber definido la variable de tipo LAContext.

  • Swift
  • Objective-C

Y con esto, cerramos esta guía, dejando el reto encima de la mesa: que terminéis la app añadiendo las alertas, la comprobación de usuario y contraseña así como el flujo final. Si no sabéis cómo crearlas en iOS 8, os recomendamos echar un vistazo a nuestra guía de desarrollo de alertas en iOS 8, igual que si tenéis algún problema a la hora de crear la app, de nuevo os insto a visitar la primera lección del curso de apps.

Aun así, en nuestro repositorio de GitHub (al que os invito a suscribiros) tenéis disponible para descarga la app completa en Swift, donde podréis ver con mayor detalle cómo funciona y probarla en vuestros iPhone o iPad con TouchID. Ojo, tenéis que tener una cuenta de desarrollador de Apple con certificados válidos y los dispositivos registrados. La única forma de probar esta app es con una cuenta oficial porque el simulador, obviamente, no está soportado.

Esperamos que la guía os haya sido de ayuda, os instamos como siempre a probar por vosotros mismos y tratar de experimentar, y hasta la próxima Good Apple Coding.

TouchID-Test-Swift | Acceso y descarga

Acerca de Julio César Fernández

Analista, consultor y periodista tecnológico, desarrollador, empresario, productor audiovisual, actor de doblaje e ingeniero de vídeo y audio.

Otras recomendaciones

Prototipos Unit Testing TDD

Lecciones por prototipos (II): test unitarios (XCTest y TDD)

Una de las cosas que normalmente se perciben más complejas en el desarrollo en cualquier …

  • Orasbae

    Hola! muy buenas tardes!

    Tengo una pequeña pregunta. Creo que se escapa un poco del tema, pero llevo bastante intentando hacerlo y no doy con la forma.

    Tengo el reconocimiento dactilar implementado a mi app y en el ViewController de Settings tengo un swicht, la pregunta es, ¿Cómo puedo hacerlo? todo lo que pruebo me da error, bueno simplemente peta la app.

    ¿Podría enviarte mi proyecto para que entendieras mejor que quiero decir?

    Espero no te moleste.

    Muchas gracias!!

    • Julio César Fernández

      Sin problema. Envíalo a info@applecoding.com y estaremos encantados de echarte una mano.

      Un saludo,