Udostępnij za pośrednictwem


Samouczek: dodawanie samoobsługowego resetowania hasła

W tym samouczku pokazano, jak umożliwić użytkownikom zmianę lub zresetowanie hasła bez udziału administratora ani działu pomocy technicznej.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Dodaj przepływ samoobsługowego resetowania hasła (SSPR).
  • Dodaj wymagany interfejs użytkownika dla samoobsługowego resetowania hasła do aplikacji.
  • Obsługa błędów.

Wymagania wstępne

Dodawanie przepływu samoobsługowego resetowania hasła

Aby dodać przepływ samoobsługowego resetowania hasła do aplikacji systemu Android, potrzebny jest interfejs użytkownika resetowania hasła:

  • Pole tekstowe danych wejściowych do zbierania adresu e-mail użytkownika (nazwy użytkownika).
  • Pole tekstowe wejściowe do zbierania jednorazowego kodu dostępu.
  • Pole tekstowe wejściowe do zbierania nowego hasła.

Gdy użytkownicy zapomną hasła, potrzebują formularza, aby wprowadzić swoje nazwy użytkowników (adresy e-mail), aby rozpocząć przepływ resetowania hasła. Użytkownik wybiera przycisk Zapomnij hasło lub link.

Uruchamianie przepływu resetowania hasła

Aby obsłużyć żądanie, gdy użytkownik wybierze przycisk Zapomnij hasło lub link, użyj metody zestawu Android SDK resetPassword(username) , jak pokazano w poniższym fragmencie kodu:

 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 
      } 
  } 
 } 
  • resetPassword(username) Metoda inicjuje przepływ resetowania hasła, a jednorazowy kod dostępu wiadomości e-mail jest wysyłany na adres e-mail użytkownika na potrzeby weryfikacji.

  • Wynik zwracany wartości resetPassword(username) to ResetPasswordStartResult.CodeRequired lub ResetPasswordError.

  • Jeśli resetPasswordResult is ResetPasswordStartResult.CodeRequiredaplikacja musi zebrać jednorazowy kod dostępu wiadomości e-mail od użytkownika i przesłać go, jak pokazano w temacie Prześlij jednorazowy kod dostępu wiadomości e-mail.

  • Jeśli resetPasswordResult is ResetPasswordErrorzestaw SDK systemu Android udostępnia metody narzędziowe umożliwiające dalsze analizowanie określonych błędów: - isUserNotFound() - isBrowserRequired()

  • Te błędy wskazują, że poprzednia operacja zakończyła się niepowodzeniem, dlatego odwołanie do nowego stanu nie jest dostępne. Obsłuż te błędy, jak pokazano w sekcji Obsługa błędów .

Przesyłanie jednorazowego kodu dostępu wiadomości e-mail

Aplikacja zbiera jednorazowy kod dostępu wiadomości e-mail od użytkownika. Aby przesłać jednorazowy kod dostępu wiadomości e-mail, użyj następującego fragmentu kodu:

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)
         }
    } 
} 
  • Zwracany wynik submitCode() akcji to ResetPasswordSubmitCodeResult.PasswordRequired lub SubmitCodeError.

  • Jeśli submitCodeResult is ResetPasswordSubmitCodeResult.PasswordRequired aplikacja musi zebrać nowe hasło od użytkownika i przesłać je, jak pokazano w sekcji Prześlij nowe hasło.

  • Jeśli użytkownik nie otrzyma jednorazowego kodu dostępu w wiadomości e-mail, aplikacja może wysłać ponownie kod dostępu jednorazowego wiadomości e-mail. Użyj następującego fragmentu kodu, aby ponownie wysłać nowy kod dostępu jednorazowego wiadomości e-mail:

    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
                  }
             } 
         } 
    } 
    
    • Zwracany wynik resendCode() akcji to ResetPasswordResendCodeResult.Success lub ResendCodeError.

    • ResendCodeError jest nieoczekiwanym błędem zestawu SDK. Ten błąd wskazuje, że poprzednia operacja nie powiodła się, więc odwołanie do nowego stanu nie jest dostępne.

  • Jeśli submitCodeResult is SubmitCodeErrorzestaw SDK systemu Android udostępnia metody narzędziowe umożliwiające dalsze analizowanie określonych błędów:

    • isInvalidCode()
    • isBrowserRequired()

    Te błędy wskazują, że poprzednia operacja zakończyła się niepowodzeniem, dlatego odwołanie do nowego stanu nie jest dostępne. Obsłuż te błędy, jak pokazano w sekcji Obsługa błędów .

Prześlij nowe hasło

Po zweryfikowaniu wiadomości e-mail użytkownika należy zebrać nowe hasło od użytkownika i przesłać je. Hasło zbierane przez aplikację od użytkownika musi spełniać zasady haseł firmy Microsoft Entra. Użyj następującego fragmentu kodu:

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)
        }
    } 
} 
  • Zwracany wynik submitPassword() akcji to ResetPasswordResult.Complete lub ResetPasswordSubmitPasswordError.

  • ResetPasswordResult.Complete wskazuje pomyślny przepływ resetowania hasła.

  • Jeśli submitPasswordResult is ResetPasswordSubmitPasswordErrorzestaw SDK udostępnia metody narzędziowe do dalszej analizy określonego typu zwróconego błędu: - isInvalidPassword() - isPasswordResetFailed()

    Te błędy wskazują, że poprzednia operacja zakończyła się niepowodzeniem, dlatego odwołanie do nowego stanu nie jest dostępne. Obsłuż te błędy, jak pokazano w sekcji Obsługa błędów .

Automatyczne logowanie po zresetowaniu hasła

Po pomyślnym przepływie resetowania hasła możesz automatycznie logować użytkowników bez inicjowania nowego przepływu logowania.

SignInContinuationState Zwraca ResetPasswordResult.Complete obiekt. Element SignInContinuationState zapewnia dostęp do signIn() metody .

Aby automatycznie logować użytkowników po zresetowaniu hasła, użyj następującego fragmentu kodu:

 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()
      }
 }

Aby pobrać oświadczenia tokenu identyfikatora po zalogowaniu, wykonaj kroki opisane w artykule Oświadczenia tokenu identyfikatora odczytu.

Obsługa błędów resetowania hasła

Może wystąpić kilka oczekiwanych błędów. Na przykład użytkownik może podjąć próbę zresetowania hasła z nieistniejącą wiadomością e-mail lub podać hasło, które nie spełnia wymagań dotyczących hasła.

Gdy wystąpią błędy, daj użytkownikom wskazówkę dotyczącą błędów.

Te błędy mogą wystąpić na początku przepływu resetowania hasła lub przy przesłaniu jednorazowego kodu dostępu wiadomości e-mail lub przy przesłaniu hasła.

Obsługa błędu uruchamiania resetowania hasła

Aby obsłużyć błąd spowodowany przez uruchomienie resetowania hasła, użyj następującego fragmentu kodu:

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

Obsługa jednorazowego kodu dostępu do przesyłania wiadomości e-mail

Aby obsłużyć błąd spowodowany przesyłaniem jednorazowego kodu wiadomości e-mail, użyj następującego fragmentu kodu:

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

Błąd obsługi przesyłania hasła

Aby obsłużyć błąd spowodowany przesyłaniem hasła, użyj następującego fragmentu kodu:

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

Następne kroki

Samouczek: obsługa rezerwowego w internecie w aplikacji dla systemu Android