Поделиться через


Руководство. Настройка самостоятельного сброса пароля

применяется к: белый круг с серым символом X. арендаторы рабочей силы зеленый круг с символом белой галочки. внешние клиенты (подробнее)

В этом руководстве показано, как разрешить пользователям изменять или сбрасывать пароль без участия администратора или службы технической поддержки.

Изучив это руководство, вы:

  • Добавьте процесс самостоятельного сброса пароля (SSPR).
  • Добавьте необходимый пользовательский интерфейс для SSPR в приложение.
  • Обработайте ошибки.

Необходимые условия

Добавить процесс самостоятельного сброса пароля

Чтобы добавить поток SSPR в приложение Android, вам нужен пользовательский интерфейс сброса пароля:

  • Поле ввода текста для сбора адреса электронной почты пользователя (имя пользователя).
  • Текстовое поле ввода для сбора однократного секретного кода.
  • Текстовое поле ввода для сбора нового пароля.

Когда пользователи забудут свои пароли, им нужна форма для ввода имени пользователя (адреса электронной почты) для запуска потока сброса пароля. Пользователь нажимает кнопку "Забыл пароль" или ссылку.

Запуск потока сброса пароля

Чтобы обрабатывать запрос, когда пользователь выбирает кнопку "Забыл пароль" или ссылку, используйте метод resetPassword(parameters) пакета SDK для Android, как показано в следующем фрагменте кода:

 private fun forgetPassword() { 
     CoroutineScope(Dispatchers.Main).launch { 
         val parameter = NativeAuthResetPasswordParameters(username = email)
         val actionResult = authClient.resetPassword(parameter)

         when (resetPasswordResult) { 
             is ResetPasswordStartResult.CodeRequired -> { 
                 // The implementation of submitCode() please see below. 
                 submitCode(resetPasswordResult.nextState) 
             } 
             is ResetPasswordError -> {
                 // Handle errors
                 handleResetPasswordError(resetPasswordResult)
             }
         }
     } 
 } 
  • метод resetPassword(parameters) инициирует поток сброса пароля, а одноразовый секретный код электронной почты отправляется на адрес электронной почты пользователя для проверки.

  • Результат возврата resetPassword(parameters)ResetPasswordStartResult.CodeRequired или ResetPasswordError.

  • Если resetPasswordResult is ResetPasswordStartResult.CodeRequired, приложение должно собирать одноразовый пароль электронной почты от пользователя и отправить его, как указано в отправке одноразового пароля электронной почты.

  • Если resetPasswordResult is ResetPasswordError, пакет SDK для Android предоставляет служебные методы для дальнейшего анализа конкретных ошибок: — isUserNotFound() - isBrowserRequired()

  • Эти ошибки указывают на то, что предыдущая операция не выполнена, поэтому ссылка на новое состояние недоступна. Обработайте эти ошибки, как показано в разделе Обработка ошибок.

Отправка однократного секретного кода электронной почты

Приложение собирает одноразовый секретный код электронной почты от пользователя. Чтобы отправить одноразовый секретный код электронной почты, используйте следующий фрагмент кода:

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)
         }
    } 
} 
  • Результат возврата действия submitCode()ResetPasswordSubmitCodeResult.PasswordRequired или SubmitCodeError.

  • Если submitCodeResult is ResetPasswordSubmitCodeResult.PasswordRequired приложению необходимо собрать новый пароль от пользователя и отправить его, как показано в отправить новый пароль.

  • Если пользователь не получает одноразовый секретный код электронной почты, приложение может повторно отправить секретный код электронной почты. Используйте следующий фрагмент кода, чтобы повторно отправить новый секретный код электронной почты:

    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
                  }
             } 
         } 
    } 
    
    • Результат возврата действия resendCode()ResetPasswordResendCodeResult.Success или ResendCodeError.

    • ResendCodeError является неожиданной ошибкой пакета SDK. Эта ошибка означает, что предыдущая операция была неудачной, поэтому ссылка на новое состояние недоступна.

  • Если submitCodeResult is SubmitCodeError, пакет SDK для Android предоставляет служебные методы для дальнейшего анализа конкретных ошибок:

    • isInvalidCode()
    • isBrowserRequired()

    Эти ошибки указывают на то, что предыдущая операция не выполнена, поэтому ссылка на новое состояние недоступна. Обработайте эти ошибки, как показано в разделе Обработка ошибок.

Отправка нового пароля

После проверки электронной почты пользователя необходимо собрать новый пароль от пользователя и отправить его. Пароль, собираемый приложением, должен соответствовать политикам паролей Microsoft Entra. Используйте следующий фрагмент кода:

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)
        }
    } 
} 
  • Результат возврата действия submitPassword()ResetPasswordResult.Complete или ResetPasswordSubmitPasswordError.

  • ResetPasswordResult.Complete указывает на успешный процесс сброса пароля.

  • Если submitPasswordResult is ResetPasswordSubmitPasswordError, пакет SDK предоставляет служебные методы для дальнейшего анализа определенного типа возвращенной ошибки: - isInvalidPassword() - isPasswordResetFailed()

    Эти ошибки указывают на то, что предыдущая операция не выполнена, поэтому ссылка на новое состояние недоступна. Обработайте эти ошибки, как показано в разделе Обработка ошибок.

Автоматический вход после сброса пароля

После успешного сброса пароля вы можете автоматически войти в систему для пользователей, не начиная новый процесс входа.

ResetPasswordResult.Complete возвращает объект SignInContinuationState. SignInContinuationState предоставляет доступ к методу signIn(parameters).

Чтобы автоматически выполнить вход пользователей после сброса пароля, используйте следующий фрагмент кода:

 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 signInContinuationState = nextState

     val parameters = NativeAuthSignInContinuationParameters()
     val signInActionResult = signInContinuationState.signIn(parameters)

     when (actionResult) {
         is SignInResult.Complete -> {
             fetchTokens(accountState = actionResult.resultValue)
         }
         else {
             // Handle unexpected error
         }
     }
  }
 
 private suspend fun fetchTokens(accountState: AccountState) {
     val getAccessTokenParameters = NativeAuthGetAccessTokenParameters()
     val accessTokenResult = accountState.getAccessToken(getAccessTokenParameters)

     if (accessTokenResult is GetAccessTokenResult.Complete) {
         val accessToken =  accessTokenResult.resultValue.accessToken
         val idToken = accountState.getIdToken()
     }
 }

Чтобы получить заявки маркера идентификатора после входа, выполните действия, описанные в Чтение заявок маркера идентификатора.

Обработка ошибок сброса пароля

Может возникнуть несколько ожидаемых ошибок. Например, пользователь может попытаться сбросить пароль с несуществующим адресом электронной почты или указать пароль, который не соответствует требованиям к паролю.

При возникновении ошибок предоставьте пользователям указание на ошибки.

Эти ошибки могут возникать в начале процесса сброса пароля, при отправке одноразового кода по электронной почте или при отправке пароля.

Обработка ошибки на этапе начала сброса пароля

Чтобы обработать ошибку, вызванную началом сброса пароля, используйте следующий фрагмент кода:

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

Обработка ошибки при отправке одноразового пароля на электронную почту

Чтобы обработать ошибку, вызванную отправкой однократного секретного кода электронной почты, используйте следующий фрагмент кода:

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

Обработка ошибки отправки пароля

Чтобы обработать ошибку, вызванную отправкой пароля, используйте следующий фрагмент кода:

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

Дальнейшие действия

Руководство: поддержка веб-резервного варианта в приложении Android