Para desarrollar esta app se han utilizado los frameworks Ionic y Angular. Además, se ha utilizado la librería Capacitor y los plugins Secure Storage y Biometric Auth para poder implementar la autenticación biométrica.
El objetivo era desarrollar una app móvil la cual permitiera el acceso a la misma mediante autenticación biométrica. Las credenciales del usuario deben cifrarse y guardarse en un almacén de claves seguro del dispositivo, para poder acceder a ellas de forma rápida mediante su huella.
Antes de comenzar el desarrollo, se inicializó un proyecto de prueba siguiendo los pasos de la documentación de Ionic, para tener una ligera noción de cómo se estructuran los elementos de un proyecto de dicho framework. Como esto no fue suficiente para tener una comprensión aceptable de los frameworks, fue necesario mirar tutoriales de Ionic y Angular en YouTube para poder comenzar a trabajar con las tecnologías.
La primera tarea era implementar un login clásico y funcional a la app mediante un formulario. Para ello, se investigó acerca de cómo crear formularios reactivos en Angular mediante el siguiente tutorial de YouTube. El funcionamiento era simple: en el componente "Home" donde se aloja el formulario se definieron dos variables, "validUsername" y "validPassword". Si lo que hubiera introducido el usuario en el formulario coincide con dichas variables a la hora de enviar el formulario, se redirige al usuario al componente "Inside". Además, las credenciales del usuario eran guardadas en sessionStorage, cosa que se corregiría más adelante.
En este punto, se comenzó a introducir el acceso mediante huella incluido en la librería Biometric Auth. Inicialmente, toda la lógica del acceso mediante huella se encontraba dentro del componente "Home", junto con el login clásico. En este momento, el acceso mediante huella no verificaba ninguna credencial del usuario, simplemente verificaba que la huella introducida era válida para redirigir al usuario al componente "Inside". Fue necesario un estudio de varios días de la librería para comprender su funcionamiento.
Dada la extensión que estaba tomando la clase del componente "Home", se decidío extraer las variables de validación del formulario y los métodos de inicio de sesión e incluirlos en un servicio, el cual se llamó "AuthService". En él no sólo se incluiría las funciones de inicio de sesión mediante texto y huella, también se incluirían futuras funcionalidades, como el cambio de contraseña o el cierre de sesión.
Al igual que con la librería Biometric Auth, fue necesario estudiar los métodos y funciones incluidas en la librería Secure Storage para poder hacer una correcta implementación en el proyecto. En este punto, se implementó la opción de habilitar el inicio de sesión mediante huella. Una vez que el usuario rellena el formulario y es redirigido a "Inside", se recuperan las credenciales previamente almacenadas en "sessionStorage", se introducen en el Secure Storage, y se eliminan del "sessionStorage". Cuando el usuario quiera volver a iniciar sesión mediante huella, si es válida recupera las credenciales del almacén seguro y las valida para redirigir de nuevo a "Inside".
Como tercera funcionalidad se implementó un cambio de contraseña, en caso de que el usuario olvide su contraseña de inicio de sesión y no tenga habilitada la huella, o simplemente decida cambiarla. Para ello, se creó un nuevo componente "Change-Password" con un nuevo formulario que permite el cambio de contraseña. Una vez que el usuario confirma que quiere cambiar su contraseña, se modifica la variable "validPassword" definida previamente. A continuación, se comprueba si tenía habilitada la huella, y si está habilitada, se actualizan sus credenciales del Secure Storage.
El cambio de contraseña presentaba un problema: al ser una variable dentro de un servicio la que valida el inicio de sesión, cada vez que se arranca la aplicación la variable volvía a tener su valor original. Es decir, si la variable se encontraba inicializada como "pass", por ejemplo, aunque el usuario cambiara la contraseña a "pass2", al volver a iniciar la app la contraseña válida volvía a ser la original. Es por esto que se necesitaba algún sitio en el que poder persistir el nombre de usuario y contraseña sin que sufriese cambios cada vez que se para y volviera a arrancar la app.
Es entonces cuando se decide utilizar una nueva entrada dentro del Secure Storage para guardar las credenciales de inicio de sesión. Por un lado, estarían las credenciales de inicio de sesión guardadas bajo la clave "key_cred_user" y por otro lado las credenciales que permiten el inicio de sesión mediante huella bajo la clave "key_finger_user". Éstas últimas debían ser iguales que las primeras para poder permitir el acceso a la app mediante huella. Esto permite que el usuario pueda modificar su contraseña y que los cambios queden guardados aunque se cierre la app.
Luego de terminar con las funcionalidades, se modificó el proyecto para incorporar buenas prácticas en el código. Desde separar completamente componente y servicio hasta añadir documentación al código, se realizaron modificaciones a éste para que fuera mucho más legible y manejable a la hora de corregir errores o crear nuevas funcionalidades en el futuro.
Por último, se realizaron pruebas para comprobar la seguridad que ofrece la librería Secure Storage. En primer lugar, se cambió el prefijo del almacén para ver si desde la misma app se podía acceder a las claves que se añadieron bajo el prefijo original. El resultado fue el esperado, ya que no permitía el acceso a las claves que se añadieron con anterioridad.
La segunda prueba consistió en crear una copia de la app con distinto applicationId y prefijo, para comprobar si una app idéntica tiene el acceso denegado al almacén seguro. El resultado fue el esperado, ya que desde esta aplicación copia era imposible acceder a las claves del almacén de la app original.
La tercera prueba consistió en volver a crear una copia con distinto applicationId pero con el mismo prefijo que la app original. En este caso, se esperaba también que no fuera posible el acceso al almacén desde la copia. El resultado fue una vez más el esperado, no era posible acceder a las claves de la app original aunque la copia tuviera el mismo prefijo.
Como última prueba, se instaló una pequeña actualización de la app sin modificar el prefijo del almacén seguro. Se quería comprobar que al instalar actualizaciones se mantuvieran los datos almacenados en el almacén seguro, ya que al borrar la app también se borran los datos. El resultado fue el esperado, al instalar la actualización, la app pedía al usuario introducir la huella y todas las características de la app funcionaban correctamente.