Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:
Externe tenants (meer informatie)
In deze zelfstudie ziet u hoe u gebruikers in staat stelt hun wachtwoord te wijzigen of opnieuw in te stellen, zonder tussenkomst van de beheerder of helpdesk.
In deze handleiding leert u:
- Voeg een selfserviceproces voor wachtwoordreset (SSPR) toe.
- Voeg de vereiste gebruikersinterface (UI) voor SSPR toe aan uw app.
- Omgaan met fouten.
Voorwaarden
- Voltooi de stappen in om gebruikers aan te melden in een voorbeeld van een native Android-app. In dit artikel wordt beschreven hoe u een voorbeeld-Android uitvoert die u configureert met behulp van uw tenantinstellingen.
- Zelfbediening voor wachtwoordherstel inschakelen. In dit artikel kunt u de verificatiemethode voor eenmalige wachtwoordcode voor e-mail inschakelen voor alle gebruikers in uw tenant. Dit is een vereiste voor SSPR.
- Zelfstudie: Uw Android-app voorbereiden op systeemeigen verificatie.
Voeg een selfservicestroom voor wachtwoordherstel toe
Als u SSPR-stroom wilt toevoegen aan uw Android-toepassing, hebt u een gebruikersinterface voor wachtwoordherstel nodig:
- Een invoertekstveld voor het verzamelen van het e-mailadres van de gebruiker (gebruikersnaam).
- Een invoertekstveld voor het verzamelen van eenmalige wachtwoordcode.
- Een invoertekstveld voor het verzamelen van een nieuw wachtwoord.
Wanneer gebruikers hun wachtwoorden vergeten, hebben ze een formulier nodig om hun gebruikersnamen (e-mailadressen) in te voeren om de stroom voor wachtwoordherstel te starten. De gebruiker selecteert de knop Wachtwoord vergeten of koppeling.
Het herstelproces voor het wachtwoord starten
Als u de aanvraag wilt verwerken wanneer de gebruiker de knop Wachtwoord vergeten knop of koppeling selecteert, gebruikt u de resetPassword(parameters) methode van de Android SDK, zoals wordt weergegeven in het volgende codefragment:
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)methode initieert de stroom voor wachtwoordherstel, en er wordt een eenmalige code verzonden naar het e-mailadres van de gebruiker voor verificatie.Het terugkeerresultaat van
resetPassword(parameters)is ofwelResetPasswordStartResult.CodeRequiredofResetPasswordError.Als
resetPasswordResult is ResetPasswordStartResult.CodeRequired, moet de app de eenmalige wachtwoordcode van de gebruiker verzamelen en deze verzenden, zoals wordt weergegeven in Eenmalige wachtwoordcode verzenden van e-mail.Als
resetPasswordResult is ResetPasswordError, biedt Android SDK hulpprogrammamethoden waarmee u de specifieke fouten verder kunt analyseren: -isUserNotFound()-isBrowserRequired()Deze fouten geven aan dat de vorige bewerking is mislukt en dat er dus geen verwijzing naar een nieuwe status beschikbaar is. U kunt deze fouten afhandelen, zoals wordt weergegeven in fouten verwerken sectie.
Eenmalige wachtwoordcode voor e-mail verzenden
Uw app verzamelt de eenmalige wachtwoordcode voor e-mail van de gebruiker. Als u de eenmalige wachtwoordcode voor e-mail wilt verzenden, gebruikt u het volgende codefragment:
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)
}
}
}
Het retourresultaat van de
submitCode()actie isResetPasswordSubmitCodeResult.PasswordRequiredofSubmitCodeError.Als
submitCodeResult is ResetPasswordSubmitCodeResult.PasswordRequiredde app een nieuw wachtwoord van de gebruiker moet verzamelen en moet verzenden zoals wordt weergegeven in Een nieuw wachtwoord verzenden.Als de gebruiker de eenmalige wachtwoordcode van de e-mail niet ontvangt, kan de app de wachtwoordcode van de e-mail opnieuw verzenden. Gebruik het volgende codefragment om een nieuwe eenmalige wachtwoordcode voor een e-mail opnieuw te verzenden:
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 } } } }Het retourresultaat van de
resendCode()actie isResetPasswordResendCodeResult.SuccessofResendCodeError.ResendCodeErroris een onverwachte fout voor SDK. Deze fout geeft aan dat de vorige bewerking is mislukt, dus er is geen verwijzing naar een nieuwe status beschikbaar.
Als
submitCodeResult is SubmitCodeError, biedt Android SDK hulpprogrammamethoden waarmee u de specifieke fouten verder kunt analyseren:isInvalidCode()isBrowserRequired()
Deze fouten geven aan dat de vorige bewerking is mislukt en dat er dus geen verwijzing naar een nieuwe status beschikbaar is. U kunt deze fouten afhandelen, zoals wordt weergegeven in fouten verwerken sectie.
Een nieuw wachtwoord verzenden
Nadat u het e-mailadres van de gebruiker hebt geverifieerd, moet u een nieuw wachtwoord van de gebruiker verzamelen en verzenden. Het wachtwoord dat de app van de gebruiker verzamelt, moet voldoen aan het wachtwoordbeleid van Microsoft Entra. Gebruik het volgende codefragment:
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)
}
}
}
Het retourresultaat van de
submitPassword()actie isResetPasswordResult.CompleteofResetPasswordSubmitPasswordError.ResetPasswordResult.Completegeeft een geslaagd proces voor het opnieuw instellen van het wachtwoord aan.Als
submitPasswordResult is ResetPasswordSubmitPasswordError, biedt de SDK hulpprogrammamethoden voor het verder analyseren van het specifieke type fout dat wordt geretourneerd: -isInvalidPassword()-isPasswordResetFailed()Deze fouten geven aan dat de vorige bewerking is mislukt en dat er dus geen verwijzing naar een nieuwe status beschikbaar is. U kunt deze fouten afhandelen, zoals wordt weergegeven in fouten verwerken sectie.
Automatisch aanmelden na het opnieuw instellen van het wachtwoord
Na een geslaagde stroom voor wachtwoordherstel kunt u uw gebruikers automatisch aanmelden zonder een nieuwe aanmeldingsstroom te starten.
De ResetPasswordResult.Complete retourneert een SignInContinuationState-object. De SignInContinuationState biedt toegang tot de signIn(parameters)-methode.
Als u gebruikers automatisch wilt aanmelden na het opnieuw instellen van een wachtwoord, gebruikt u het volgende codefragment:
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()
}
}
Als u ID-tokenclaims wilt ophalen na aanmelding, gebruikt u de stappen in Tokenclaims ID lezen.
Fouten bij het opnieuw instellen van wachtwoorden afhandelen
Er kunnen enkele verwachte fouten optreden. De gebruiker kan bijvoorbeeld proberen het wachtwoord opnieuw in te stellen met een niet-bestaand e-mailbericht of een wachtwoord opgeven dat niet voldoet aan de wachtwoordvereisten.
Wanneer er fouten optreden, geeft u uw gebruikers een aanwijzing over de fouten.
Deze fouten kunnen optreden aan het begin van de stroom voor wachtwoordherstel of bij het verzenden van een eenmalige wachtwoordcode of bij het verzenden van een wachtwoord.
Fout bij opnieuw instellen van het beginwachtwoord afhandelen
Gebruik het volgende codefragment om de fout af te handelen die wordt veroorzaakt door het opnieuw instellen van wachtwoorden:
private fun handleResetPasswordError(error: ResetPasswordError) {
when {
error.isUserNotFound() -> {
// Display error
}
else -> {
// Unexpected error
}
}
}
Afhandeling van fout bij het verzenden van eenmalige wachtwoordcode via e-mail
Gebruik het volgende codefragment om de fout af te handelen die wordt veroorzaakt door het verzenden van een eenmalige wachtwoordcode voor e-mail:
private fun handleSubmitCodeError(error: SubmitCodeError) {
when {
error.isInvalidCode() -> {
// Display error
}
else -> {
// Unexpected error
}
}
}
Fout bij verzenden van wachtwoord afhandelen
Gebruik het volgende codefragment om de fout af te handelen die wordt veroorzaakt door het verzenden van een wachtwoord:
private fun handleSubmitPasswordError(error: ResetPasswordSubmitPasswordError) {
when {
error.isInvalidPassword() || error.isPasswordResetFailed()
-> {
// Display error
}
else -> {
// Unexpected error
}
}
}