Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
применяется к: арендаторы рабочей силы
внешние клиенты (подробнее)
В этом руководстве показано, как разрешить пользователям изменять или сбрасывать пароль без участия администратора или службы технической поддержки.
Изучив это руководство, вы:
- Добавьте процесс самостоятельного сброса пароля (SSPR).
- Добавьте необходимый пользовательский интерфейс для SSPR в приложение.
- Обработайте ошибки.
Необходимые условия
- Выполните действия, описанные в разделе Вход пользователя в примере нативного мобильного приложения Android. В этой статье показано, как запустить пример Android, настроенный с помощью параметров клиента.
- Включить самостоятельный сброс пароля. В этой статье описано, как включить метод аутентификации с помощью однократного кода доступа по электронной почте для всех пользователей в клиенте, что является обязательным требованием для SSPR.
- Руководство: Подготовка Android-приложения для нативной аутентификации.
Добавить процесс самостоятельного сброса пароля
Чтобы добавить поток 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