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
- Complete los pasos del Inicio de sesión de usuarios en una aplicación móvil Android nativa de ejemplo. En este artículo se muestra cómo ejecutar un ejemplo de Android que configure mediante la configuración del inquilino.
- Habilitar el autoservicio de restablecimiento de contraseña. Este artículo le permite habilitar el método de autenticación de código de acceso de un solo uso de correo electrónico para todos los usuarios del inquilino, que es un requisito para SSPR.
- Tutorial: preparación de la aplicación de Android para la autenticación nativa.
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)
esResetPasswordStartResult.CodeRequired
oResetPasswordError
.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()
esResetPasswordSubmitCodeResult.PasswordRequired
oSubmitCodeError
.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()
esResetPasswordResendCodeResult.Success
oResendCodeError
.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()
esResetPasswordResult.Complete
oResetPasswordSubmitPasswordError
.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