Tutoriel : Ajouter une réinitialisation de mot de passe en libre-service

S’applique à : cercle vert avec un symbole de coche blanc qui indique que le contenu suivant s’applique aux locataires externes. Locataires externes (en savoir plus)

Ce tutoriel montre comment permettre aux utilisateurs de modifier ou de réinitialiser leur mot de passe, sans intervention de l’administrateur ou du support technique.

Dans ce tutoriel, vous allez :

  • Ajouter un flux de réinitialisation de mot de passe en libre-service (SSPR).
  • Ajoutez l’interface utilisateur requise pour SSPR à votre application.
  • Gérez les erreurs.

Conditions préalables

Ajouter un flux de réinitialisation de mot de passe en libre-service

Pour ajouter un flux SSPR à votre application Android, vous avez besoin d’une interface utilisateur de réinitialisation de mot de passe :

  • Champ de texte d’entrée pour collecter l’adresse e-mail de l’utilisateur (nom d’utilisateur).
  • Champ de texte d’entrée pour collecter un code secret à usage unique.
  • Champ de texte d’entrée pour collecter un nouveau mot de passe.

Lorsque les utilisateurs oublient leurs mots de passe, ils ont besoin d’un formulaire pour entrer leurs noms d’utilisateur (adresses e-mail) pour démarrer le flux de réinitialisation de mot de passe. L’utilisateur sélectionne le bouton ou le lien Oublier le mot de passe.

Démarrer le flux de réinitialisation de mot de passe

Pour gérer la requête lorsque l’utilisateur sélectionne le bouton ou le lien oublier le mot de passe, utilisez la méthode resetPassword(parameters) du Kit de développement logiciel (SDK) Android, comme indiqué dans l’extrait de code suivant :

 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) méthode lance le flux de réinitialisation de mot de passe et un code secret à usage unique est envoyé à l’adresse e-mail de l’utilisateur pour vérification.

  • Le résultat de retour de resetPassword(parameters) est ResetPasswordStartResult.CodeRequired ou ResetPasswordError.

  • Si resetPasswordResult is ResetPasswordStartResult.CodeRequired, l’application doit collecter le code secret à usage unique de l’utilisateur et l’envoyer comme indiqué dans Envoyer un code secret à usage unique.

  • Si resetPasswordResult is ResetPasswordError, Android SDK fournit des méthodes utilitaires pour vous permettre d’analyser plus loin les erreurs spécifiques : - isUserNotFound() - isBrowserRequired()

  • Ces erreurs indiquent que l’opération précédente a échoué et qu’une référence à un nouvel état n’est pas disponible. Gérez ces erreurs comme indiqué dans la section Gérer les erreurs.

Envoyer un code secret à usage unique par e-mail

Votre application collecte le code secret à usage unique de l’utilisateur par e-mail. Pour envoyer le code secret unique de l’e-mail, utilisez l’extrait de code suivant :

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)
         }
    } 
} 
  • Le résultat de retour de l’action de submitCode() est ResetPasswordSubmitCodeResult.PasswordRequired ou SubmitCodeError.

  • Si submitCodeResult is ResetPasswordSubmitCodeResult.PasswordRequired l’application doit collecter un nouveau mot de passe auprès de l’utilisateur et l’envoyer comme indiqué dans Envoyer un nouveau mot de passe.

  • Si l’utilisateur ne reçoit pas le code secret à usage unique de l’e-mail dans son e-mail, l’application peut renvoyer le code secret à usage unique de l’e-mail. Utilisez l’extrait de code suivant pour renvoyer un nouveau code secret à usage unique :

    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
                  }
             } 
         } 
    } 
    
    • Le résultat de retour de l’action de resendCode() est ResetPasswordResendCodeResult.Success ou ResendCodeError.

    • ResendCodeError est une erreur inattendue pour le Kit de développement logiciel (SDK). Cette erreur indique que l’opération précédente a échoué. Par conséquent, une référence à un nouvel état n’est pas disponible.

  • Si submitCodeResult is SubmitCodeError, Android SDK fournit des méthodes utilitaires pour vous permettre d’analyser les erreurs spécifiques plus loin :

    • isInvalidCode()
    • isBrowserRequired()

    Ces erreurs indiquent que l’opération précédente a échoué et qu’une référence à un nouvel état n’est pas disponible. Gérez ces erreurs comme indiqué dans la section Gérer les erreurs.

Envoyer un nouveau mot de passe

Après avoir vérifié l’e-mail de l’utilisateur, vous devez collecter un nouveau mot de passe auprès de l’utilisateur et l’envoyer. Le mot de passe que l'application collecte auprès de l'utilisateur doit respecter politiques de mot de passe de Microsoft Entra. Utilisez l’extrait de code suivant :

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)
        }
    } 
} 
  • Le résultat de retour de l’action de submitPassword() est ResetPasswordResult.Complete ou ResetPasswordSubmitPasswordError.

  • ResetPasswordResult.Complete indique un flux de réinitialisation de mot de passe réussi.

  • Si submitPasswordResult is ResetPasswordSubmitPasswordError, le Kit de développement logiciel (SDK) fournit des méthodes utilitaires pour analyser davantage le type d’erreur spécifique retourné : - isInvalidPassword() - isPasswordResetFailed()

    Ces erreurs indiquent que l’opération précédente a échoué et qu’une référence à un nouvel état n’est pas disponible. Gérez ces erreurs comme indiqué dans la section Gérer les erreurs.

Connexion automatique après la réinitialisation du mot de passe

Après un flux de réinitialisation de mot de passe réussi, vous pouvez automatiquement connecter vos utilisateurs sans lancer un nouveau flux de connexion.

ResetPasswordResult.Complete retourne l’objet SignInContinuationState. SignInContinuationState permet d’accéder à la méthode signIn(parameters).

Pour connecter automatiquement les utilisateurs après une réinitialisation de mot de passe, utilisez l’extrait de code suivant :

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

Pour récupérer les revendications de jeton d’ID après la connexion, suivez les étapes décrites dans Lire les revendications de jeton d’ID.

Gérer les erreurs de réinitialisation de mot de passe

Quelques erreurs attendues peuvent se produire. Par exemple, l’utilisateur peut tenter de réinitialiser le mot de passe avec un e-mail inexistant ou de fournir un mot de passe qui ne répond pas aux exigences de mot de passe.

Lorsque des erreurs se produisent, donnez à vos utilisateurs un indice sur les erreurs.

Ces erreurs peuvent se produire au début du flux de réinitialisation de mot de passe ou lors de l’envoi d’un code secret à usage unique ou lors de l’envoi du mot de passe.

Gérer l’erreur de réinitialisation du mot de passe de démarrage

Pour gérer l’erreur provoquée par la réinitialisation du mot de passe, utilisez l’extrait de code suivant :

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

Gérer l’erreur d’envoi d’un code secret à usage unique par e-mail

Pour gérer l’erreur provoquée par l’envoi d’un code secret à usage unique par e-mail, utilisez l’extrait de code suivant :

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

Gérer l’erreur d’envoi du mot de passe

Pour gérer l’erreur provoquée par l’envoi du mot de passe, utilisez l’extrait de code suivant :

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

Étapes suivantes

Tutoriel : Prise en charge du secours web dans l’application Android