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
- Wykonaj kroki opisane w artykule Logowanie użytkowników w przykładowej natywnej aplikacji mobilnej dla systemu Android. W tym artykule pokazano, jak uruchomić przykładowy system Android skonfigurowany przy użyciu ustawień dzierżawy.
- Włącz samoobsługowe resetowanie hasła. Ten artykuł umożliwia włączenie jednorazowej metody uwierzytelniania kodu dostępu poczty e-mail dla wszystkich użytkowników w dzierżawie, co jest wymaganiem dla samoobsługowego resetowania hasła.
- Samouczek: przygotowywanie aplikacji systemu Android do uwierzytelniania natywnego.
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)
toResetPasswordStartResult.CodeRequired
lubResetPasswordError
.Jeśli
resetPasswordResult is ResetPasswordStartResult.CodeRequired
aplikacja 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 ResetPasswordError
zestaw 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 toResetPasswordSubmitCodeResult.PasswordRequired
lubSubmitCodeError
.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 toResetPasswordResendCodeResult.Success
lubResendCodeError
.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 SubmitCodeError
zestaw 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 toResetPasswordResult.Complete
lubResetPasswordSubmitPasswordError
.ResetPasswordResult.Complete
wskazuje pomyślny przepływ resetowania hasła.Jeśli
submitPasswordResult is ResetPasswordSubmitPasswordError
zestaw 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