Uso de Jetpack Credential Manager para almacenar y recuperar contraseñas en la aplicación | de Tom Colvin | febrero 2023

Foto de Scott Webb El almacenamiento de datos de usuario ha sido tradicionalmente un ir y venir en Android, pero una nueva biblioteca lanzada a principios de este mes parece una forma prometedora de abordarlo. Lo que queremos es simple:

  • Una forma de almacenar el nombre de usuario/contraseña de un usuario (u otras credenciales) al registrarse o iniciar sesión por primera vez
  • Una forma de iniciar sesión con un solo toque con una contraseña guardada
  • Para que las contraseñas guardadas de un usuario se almacenen de forma segura en su cuenta de Google, sobrevivan a la reinstalación de la aplicación y sean accesibles en todos sus dispositivos.

La nueva biblioteca Jetpack Credential Manager ofrece todo esto en un paquete fácil de usar. Este artículo muestra cómo agregar esto a su aplicación. Aquí hay una demostración de lo que vamos a crear:Al iniciar sesión por primera vez, el usuario tiene la opción de guardar sus credenciales. Los inicios de sesión posteriores pueden simplemente usar las credenciales guardadas. En esta demostración usamos credenciales de nombre de usuario/contraseña. Pero uno de los activos más importantes de esta biblioteca es su soporte flexible para cualquier método de autenticación que elija el usuario. Por lo tanto, admite tokens de inicio de sesión federados, claves de acceso (FIDO2/autenticación de clave privada) o cualquier otra cosa.

El código de este artículo está disponible en mi GitHub.

Agregar la biblioteca a su proyecto se realiza mediante Gradle://Implementación de soporte de credenciales («androidx.credentials:credentials:1.2.0-alpha01»)// opcional: se requiere para el soporte de credenciales del servicio de juegos, para dispositivos que ejecutan // Android 13 y versiones anteriores .implementation(«androidx.credentials:credentials-play-services-auth:1.2.0-alpha01»)Para hacer cualquier cosa con esta biblioteca, necesita una instancia de CredentialManager. Es útil crear esto de forma perezosa (para que solo se cree una instancia cuando sea necesario). Aquí, la aplicación es una instancia de mi clase de aplicación disponible en mi AndroidViewModel: ahora podemos hacer referencia a credentialManager en todo el modelo de vista con la confianza de que estará allí cuando lo necesitemos y solo se creará una vez. Si el usuario está registrado o firmado con éxito, nos gustaría ofrecer almacenar estas credenciales en su tienda. Muy simple: Este parámetro de actividad es la actividad actual. En una función de redacción, puede obtener esto con LocalContext.current.getActivity() . Es necesario porque el sistema operativo muestra una superposición en su aplicación y le pregunta al usuario si desea guardar las credenciales:Después de una autenticación exitosa, se le pide al usuario que guarde su contraseña. El código anterior requiere:

  1. Manejo de errores, ya que hay muchas excepciones diferentes que puede generar credentialManager.createCredential().
  2. Ejecutar de forma asíncrona.

Poniendo todo esto junto, obtenemos esto: Tenga en cuenta que esto es divertido, por lo que se ejecuta en la corrutina del código de llamada. Observe también cómo capturamos por separado e ignoramos de inmediato CreateCredentialCancellationException. Esta excepción se lanza si el usuario no guarda la contraseña (por ejemplo, al cerrar la ventana emergente). No tiene sentido informar esto a la interfaz de usuario ya que el usuario ya lo sabe.

Contenidos

Cómo encaja esto en el proceso de inicio de sesión/registro

Llame a saveCredential(…) arriba cuando el usuario se haya registrado correctamente o cuando haya iniciado sesión correctamente ingresando manualmente un nombre de usuario o contraseña. En la aplicación de demostración, escribí la función signInOrSignUpWithEnteredCredential(…) para demostrar esto: esto también muestra cómo el proceso de inicio de sesión y el proceso para guardar las credenciales se pueden realizar en la misma rutina (y por qué llamamos saveCredential(. ..) por lo tanto, se convirtió en una diversión suspendida). Una vez que se hayan guardado las credenciales, puede usarlas para iniciar sesión la próxima vez. Use este código para obtener credenciales guardadas: este es un proceso de dos pasos. Primero formulamos una GetCredentialRequest que le dice a la biblioteca qué tipo de credenciales queremos (en nuestro caso, solo GetPasswordOption(), es decir, nombre de usuario/contraseña). Luego mostramos el cuadro de diálogo donde el usuario puede usar CredentialManager.getCredential(…) para seleccionar qué credenciales usar.Ofrezca al usuario iniciar sesión con sus credenciales guardadas. Si hay varias credenciales disponibles, el usuario puede elegir de una lista. Como antes, esto debe ejecutarse de forma asincrónica y es necesario realizar un manejo de errores, ya que puede haber muchos tipos diferentes de excepciones que pueden resultar de get: como antes, usamos suspend fun para que se ejecute en la rutina de la persona que llama. Hay dos posibles excepciones:

  • GetCredentialCancellationException indica que el usuario ha optado por no concederle permiso para acceder a las credenciales, por ejemplo, cerrando el cuadro de diálogo
  • NoCredentialException indica que el usuario no tiene credenciales guardadas para su aplicación

Hay muchas excepciones más complejas descritas en los documentos de la API. Aquí solo los estamos volviendo a expulsar para que el código de llamada pueda decidir qué hacer. Por cierto, aquí puedes ver por qué la aplicación no necesita solicitar permisos. Es completamente seguro para el usuario, ya que elige manualmente a qué credenciales puede acceder la aplicación. Y Las credenciales guardadas incluso están disponibles en los otros dispositivos del usuariosiempre y cuando hayan iniciado sesión en Android con la misma cuenta de Google.

Cómo encaja esto en el proceso de registro

Cuando el usuario hace clic en el Iniciar sesión con credenciales guardadas botón, intentaremos recuperar las credenciales guardadas y luego las usaremos para iniciar sesión. Como antes, todo esto se hace en una sola rutina, lo que muestra por qué es útil hacer que getCredential(…) sea una función de suspensión.

Hazlo aún más fácil para ti

Podría ir un paso más allá y hacer que el usuario ni siquiera tenga que tocar un Iniciar sesión con credenciales guardadas Botón. Para hacer esto, intente getCredential() tan pronto como aparezca la pantalla de inicio de sesión en su aplicación. Es posible que el usuario no haya guardado ninguna credencial, pero si lo hizo, no lo molestó porque no se mostraron ventanas emergentes. Y si guardaron las credenciales y le dieron permiso para usar una, puede registrarse de inmediato. Jetpack Credential Manager admite casi cualquier tipo de credencial:

  • Para almacenar una clave maestra (FIDO2, credenciales de clave privada), cree un objeto CreatePublicKeyCredentialRequest y pase su especificación WebAuthn JSON al constructor. Luego use este objeto como un argumento de solicitud de credentialManager.createCredential().
  • Para obtener una clave maestra, la lista que se pasa al constructor de GetCredentialRequest debe contener una instancia de GetPublicKeyCredentialOption (creada con la especificación de solicitud JSON del servidor).
  • Para almacenar cualquier otro tipo de credencial, incluidas las propietarias, cree una instancia de CreateCustomCredentialRequest y pásela a credentialManager.createCredential(). Para recuperar, cree una instancia de GetCustomCredentialOption y agréguela a la lista que se pasa a GetCredentialRequest.

Para obtener más información sobre el uso de claves de acceso con Jetpack Credential Manager, consulte la Guía para desarrolladores.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.