Compartir a través de


Tutorial: agregar autoservicio de restablecimiento de contraseña

Este tutorial muestra cómo habilitar que los usuarios puedan cambiar o restablecer su contraseña, sin intervención del administrador o del departamento de soporte técnico.

En este tutorial, aprenderá a:

  • Agregar flujo de autoservicio de restablecimiento de contraseña (SSPR).
  • Agregue la interfaz de usuario (UI) necesaria para el SSPR a la aplicación.
  • Manipulación de errores.

Requisitos previos

Agregar flujo de restablecimiento de contraseña de autoservicio

Para agregar el flujo de SSPR a su aplicación Android, necesita una interfaz de usuario de restablecimiento de contraseña:

  • Un campo de texto de entrada para recopilar la dirección de correo electrónico del usuario (nombre de usuario).
  • Un campo de texto de entrada para recopilar el código de acceso de un solo uso.
  • Un campo de texto de entrada para recopilar la nueva contraseña.

Cuando los usuarios olvidan sus contraseñas, necesitan un formulario para introducir sus nombres de usuario (direcciones de correo electrónico) para iniciar el flujo de restablecimiento de contraseña. El usuario selecciona el botón o vínculo Olvidé la contraseña.

Iniciar flujo de restablecimiento de contraseña

Para controlar la solicitud cuando el usuario seleccione el botón Olvidé la contraseña, utilice el método resetPassword(username) de Android SDK como se muestra en el siguiente fragmento de código:

 private fun forgetPassword() { 
  CoroutineScope(Dispatchers.Main).launch { 
      try { 
        val resetPasswordResult = authClient.resetPassword( 
              username = emailAddress 
          ) 

         when (resetPasswordResult) { 
             is ResetPasswordStartResult.CodeRequired -> { 
                 // The implementation of submiteCode() please see below. 
                 submitCode(resetPasswordResult.nextState) 
             } 
              is ResetPasswordError -> {
                  // Handle errors
                  handleResetPasswordError(resetPasswordResult)
              }
         } 
     } catch (exception: MsalException) { 
          // Handle exception 
      } 
  } 
 } 
  • El método resetPassword(username) inicia el flujo de restablecimiento de contraseña y se envía un código de acceso de un solo uso por correo electrónico a la dirección de correo electrónico del usuario para su comprobación.

  • El resultado devuelto de resetPassword(username) es ResetPasswordStartResult.CodeRequired o ResetPasswordError.

  • En el caso de resetPasswordResult is ResetPasswordStartResult.CodeRequired, la aplicación debe recopilar el código de acceso de un solo uso del correo electrónico del usuario y enviarlo como se muestra en Enviar código de acceso de un solo uso de correo electrónico.

  • En el caso de resetPasswordResult is ResetPasswordError, Android SDK proporciona métodos de utilidad para permitirle analizar aún más los errores específicos: - isUserNotFound() - isBrowserRequired()

  • Estos errores indican que la operación anterior no tuvo éxito, así que no está disponible una referencia a un nuevo estado. Controle estos errores como se muestra en la sección Controlar errores.

Enviar código de acceso de un solo uso de correo electrónico

La aplicación recopila el código de acceso de un solo uso del correo electrónico del usuario. Para enviar el código de acceso de un solo uso de correo electrónico, use el siguiente fragmento de código:

private suspend fun submitCode(currentState: ResetPasswordCodeRequiredState) { 
    val code = binding.codeText.text.toString() 
    val submitCodeResult = currentState.submitCode(code) 

    when (submitCodeResult) { 
        is ResetPasswordSubmitCodeResult.PasswordRequired -> { 
            // Handle success
            resetPassword(submitCodeResult.nextState) 
        } 
         is SubmitCodeError -> {
             // Handle errors
             handleSubmitCodeError(actionResult)
         }
    } 
} 
  • El resultado de la acción submitCode() es ResetPasswordSubmitCodeResult.PasswordRequired o SubmitCodeError.

  • En el caso de submitCodeResult is ResetPasswordSubmitCodeResult.PasswordRequired la aplicación debe recopilar una nueva contraseña del usuario y enviarla como se muestra en Enviar una contraseña nueva.

  • Si el usuario no recibe el código de acceso de un solo uso de correo electrónico en su correo electrónico, la aplicación puede volver a enviar el código de acceso de un solo uso de correo electrónico. Utilice el siguiente fragmento de código para reenviar un nuevo código de acceso de correo electrónico:

    private fun resendCode() { 
         clearCode() 
    
         val currentState = ResetPasswordCodeRequiredState 
    
         CoroutineScope(Dispatchers.Main).launch { 
             val resendCodeResult = currentState.resendCode() 
    
             when (resendCodeResult) { 
                 is ResetPasswordResendCodeResult.Success -> { 
                     // Handle code resent success
                 } 
                 is ResendCodeError -> {
                      // Handle ResendCodeError errors
                  }
             } 
         } 
    } 
    
    • El resultado de la acción resendCode() es ResetPasswordResendCodeResult.Success o ResendCodeError.

    • ResendCodeError es un error inesperado para el SDK. Este error indica que la operación anterior no tuvo éxito, así que no está disponible una referencia a un nuevo estado.

  • En el caso de submitCodeResult is SubmitCodeError, Android SDK proporciona métodos de utilidad para permitirle analizar aún más los errores específicos:

    • isInvalidCode()
    • isBrowserRequired()

    Estos errores indican que la operación anterior no tuvo éxito, así que no está disponible una referencia a un nuevo estado. Controle estos errores como se muestra en la sección Controlar errores.

Enviar una nueva contraseña

Después de comprobar el correo electrónico del usuario, debe recopilar una nueva contraseña del usuario y enviarla. La contraseña que recopila la aplicación del usuario debe cumplir las directivas de contraseña de Microsoft Entra. Use el siguiente fragmento de código:

private suspend fun resetPassword(currentState: ResetPasswordPasswordRequiredState) { 
    val password = binding.passwordText.text.toString() 

    val submitPasswordResult = currentState.submitPassword(password) 

    when (submitPasswordResult) { 
        is ResetPasswordResult.Complete -> { 
            // Handle reset password complete. 
        } 
        is ResetPasswordSubmitPasswordError -> {
            // Handle errors
            handleSubmitPasswordError(actionResult)
        }
    } 
} 
  • El resultado de la acción submitPassword() es ResetPasswordResult.Complete o ResetPasswordSubmitPasswordError.

  • ResetPasswordResult.Complete indica un flujo de restablecimiento de contraseña correcto.

  • En el caso de submitPasswordResult is ResetPasswordSubmitPasswordError, el SDK proporciona métodos de utilidad para analizar con más detalle el tipo específico de error devuelto: - isInvalidPassword() - isPasswordResetFailed()

    Estos errores indican que la operación anterior no tuvo éxito, así que no está disponible una referencia a un nuevo estado. Controle estos errores como se muestra en la sección Controlar errores.

Iniciar sesión automáticamente después del restablecimiento de contraseña

Después de un flujo de restablecimiento de contraseña correcto, puede iniciar sesión automáticamente a los usuarios sin iniciar un flujo de inicio de sesión nuevo.

Devuelve SignInContinuationState el objeto ResetPasswordResult.Complete. El SignInContinuationState proporciona acceso al método signIn().

Para iniciar sesión automáticamente a los usuarios después de un restablecimiento de contraseña, use el siguiente fragmento de código:

 private suspend fun resetPassword(currentState: ResetPasswordPasswordRequiredState) { 
     val submitPasswordResult = currentState.submitPassword(password) 
 
     when (submitPasswordResult) { 
         is ResetPasswordResult.Complete -> { 
             signInAfterPasswordReset(nextState = actionResult.nextState)
         } 
     } 
 } 
 
 private suspend fun signInAfterPasswordReset(nextState: SignInContinuationState) {
      val currentState = nextState
      val actionResult = currentState.signIn()
      when (actionResult) {
          is SignInResult.Complete -> {
              fetchTokens(accountState = actionResult.resultValue)
          }
          else {
              // Handle unexpected error
          }
      }
  }
 
  private suspend fun fetchTokens(accountState: AccountState) {
      val accessTokenResult = accountState.getAccessToken()
      if (accessTokenResult is GetAccessTokenResult.Complete) {
          val accessToken =  accessTokenResult.resultValue.accessToken
          val idToken = accountState.getIdToken()
      }
 }

Para recuperar notificaciones de token de identificador después del inicio de sesión, siga los pasos descritos en Notificaciones de token de identificador de lectura.

Control de errores de restablecimiento de contraseña

Pueden producirse algunos errores esperados. Por ejemplo, el usuario podría intentar restablecer la contraseña con un correo electrónico inexistente o proporcionar una contraseña que no cumple los requisitos de contraseña.

Cuando se produzcan errores, proporcione a los usuarios una sugerencia sobre los errores.

Estos errores pueden producirse al principio del flujo de restablecimiento de contraseña o al enviar el código de acceso de un solo uso o al enviar la contraseña.

Control del error de inicio de restablecimiento de contraseña

Para controlar el error causado por el inicio del restablecimiento de la contraseña, utilice el siguiente fragmento de código:

private fun handleResetPasswordError(error: ResetPasswordError) {
    when {
        error.isUserNotFound() -> {
            // Display error
        }
        else -> {
            // Unexpected error
        }
    }
}

Control del error de enviar código de acceso de un solo uso de correo electrónico

Para controlar el error causado por enviar el código de acceso de un solo uso de correo electrónico, use el siguiente fragmento de código:

private fun handleSubmitCodeError(error: SubmitCodeError) {
    when {
        error.isInvalidCode() -> {
            // Display error
        }
        else -> {
            // Unexpected error
        }
    }
}

Control del error de envío de contraseña

Para controlar el error causado por el envío de contraseña, utilice el siguiente fragmento de código:

private fun handleSubmitPasswordError(error: ResetPasswordSubmitPasswordError) {
    when {
        error.isInvalidPassword() || error.isPasswordResetFailed()
        -> {
            // Display error
        }
        else -> {
            // Unexpected error
        }
    }
}

Pasos siguientes

Tutorial: compatibilidad con la web de reserva en aplicaciones Android