Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :
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
- Suivez les étapes décrites dans Connecter des utilisateurs à un exemple d’application mobile Android native. Cet article vous montre comment exécuter un exemple d’Android que vous configurez à l’aide de vos paramètres de locataire.
- Activer la réinitialisation de mot de passe en libre-service. Cet article vous permet d’activer la méthode d’authentification par mot de passe unique par e-mail pour tous les utilisateurs de votre locataire, ce qui est une exigence pour SSPR.
- Tutoriel : Préparer votre application Android pour l’authentification native.
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)estResetPasswordStartResult.CodeRequiredouResetPasswordError.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()estResetPasswordSubmitCodeResult.PasswordRequiredouSubmitCodeError.Si
submitCodeResult is ResetPasswordSubmitCodeResult.PasswordRequiredl’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()estResetPasswordResendCodeResult.SuccessouResendCodeError.ResendCodeErrorest 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()estResetPasswordResult.CompleteouResetPasswordSubmitPasswordError.ResetPasswordResult.Completeindique 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