Skip to content

lintoeli/fingerLogin

Repository files navigation

fingerLogin

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.

Objetivo

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.

Procedimiento

Pasos previos

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.

Primera funcionalidad: Acceso a la app básico

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.

Segunda funcionalidad: Acceso a la app mediante huella

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.

Creación del servicio "AuthService"

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.

Implementación del Secure Storage

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".

Tercera funcionalidad: Cambio de contraseña

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.

Cuarta funcionalidad: Registro

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.

Buenas prácticas

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.

Pruebas Secure Storage

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.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published