Delen via


Zelfstudie: Aanmeldings-app voor Android toevoegen met behulp van systeemeigen verificatie

Deze zelfstudie laat zien hoe u een gebruiker met eenmalige wachtwoordcode of gebruikersnaam en wachtwoord in uw mobiele Android-app kunt aanmelden en afmelden met behulp van systeemeigen verificatie.

In deze zelfstudie leert u het volgende:

  • Meld u aan bij een gebruiker met eenmalige wachtwoordcode of gebruikersnaam (e-mail) en wachtwoord.
  • Meld u af bij een gebruiker.
  • Aanmeldingsfout afhandelen

Vereisten

Een gebruiker aanmelden

Als u een gebruiker wilt aanmelden met behulp van de eenmalige wachtwoordcode, verzamelt u de e-mail en verzendt u een e-mailbericht met een eenmalige wachtwoordcode voor de gebruiker om zijn of haar e-mail te verifiëren. Wanneer de gebruiker een geldige eenmalige wachtwoordcode invoert, meldt de app zich aan.

Als u zich wilt aanmelden bij een gebruiker met een gebruikersnaam (e-mailadres) en wachtwoord, moet u het e-mailadres en wachtwoord van de gebruiker verzamelen. Als de gebruikersnaam en het wachtwoord geldig zijn, meldt de app zich aan bij de gebruiker.

Als u zich wilt aanmelden bij een gebruiker, moet u het volgende doen:

  1. Maak een gebruikersinterface (UI) om:

    • Verzamel een e-mailbericht van de gebruiker. Voeg validatie toe aan uw invoer om ervoor te zorgen dat de gebruiker een geldig e-mailadres invoert.
    • Verzamel een wachtwoord als u zich aanmeldt met de gebruikersnaam (e-mail) en het wachtwoord.
    • Verzamel een eenmalige wachtwoordcode voor e-mail van de gebruiker als u zich aanmeldt met een eenmalige wachtwoordcode voor e-mail.
    • Eenmalige wachtwoordcode opnieuw verzenden (aanbevolen) als u zich aanmeldt met een eenmalige wachtwoordcode voor e-mail.
  2. Voeg in uw gebruikersinterface een knop toe waarvan de selectgebeurtenis een aanmelding start, zoals wordt weergegeven in het volgende codefragment:

     CoroutineScope(Dispatchers.Main).launch {
         val actionResult = authClient.signIn(
             username = emailAddress
             //password = password, Pass 'password' param if you sign in with username (email) and password
         )
         if (actionResult is SignInResult.CodeRequired) {
             val nextState = actionResult.nextState
             val submitCodeActionResult = nextState.submitCode(
                 code = code
             )
             if (submitCodeActionResult is SignInResult.Complete){
                 // Handle sign in success
                 val accountState = submitCodeActionResult.resultValue
                 val accessTokenResult = accountState.getAccessToken()
                 if (accessTokenResult is GetAccessTokenResult.Complete) {
                     val accessToken = accessTokenResult.resultValue.accessToken
                     val idToken = accountState.getIdToken()
                 }
             }
         }
     }
    

    Als de gebruiker geen wachtwoordcode hoeft in te dienen, bijvoorbeeld wanneer een gebruiker zich aanmeldt met een e-mailadres en wachtwoord, gebruikt u het volgende codefragment:

        CoroutineScope(Dispatchers.Main).launch {
            val actionResult = authClient.signIn(
                username = emailAddress,
                password = password
            )
            if (actionResult is SignInResult.Complete) -> {
                // Handle sign in success
                val accountState = actionResult.resultValue
                val accessTokenResult = accountState.getAccessToken()
                if (accessTokenResult is GetAccessTokenResult.Complete) {
                        val accessToken = accessTokenResult.resultValue.accessToken
                        val idToken = accountState.getIdToken()
                    }
            }
        }
    
    • Gebruik de SDK signIn(username) of signIn(username, password) methode om de aanmeldingsstroom te starten.
    • De parameter van de methode username is vervolgens het e-mailadres dat u van de gebruiker verzamelt.
    • Als de aanmeldingsmethode gebruikersnaam (e-mailadres) en wachtwoord is, is de parameter van de methode het password wachtwoord dat u van de gebruiker verzamelt.
    • In het meest voorkomende scenario retourneert het signIn(username) of signIn(username, password)een resultaat, SignInResult.CodeRequiredwat aangeeft dat de SDK verwacht dat de app de e-mail eenmalige wachtwoordcode verzendt die naar het e-mailadres van de gebruiker wordt verzonden.
    • Het SignInResult.CodeRequired object bevat een nieuwe statusverwijzing, die we kunnen ophalen via actionResult.nextState.
    • De nieuwe status geeft ons toegang tot twee nieuwe methoden:
      • submitCode() verzendt de eenmalige wachtwoordcode van de e-mail die door de app van de gebruiker wordt verzameld.
      • resendCode() Hiermee wordt de eenmalige wachtwoordcode van het e-mailbericht opnieuw verzonden als de gebruiker de code niet ontvangt.

Aanmeldingsfouten afhandelen

Tijdens het aanmelden slagen niet alle acties. De gebruiker kan zich bijvoorbeeld proberen aan te melden met een e-mailadres dat niet bestaat of een ongeldige code verzendt.

Aanmeldingsfouten afhandelen

Als u fouten in de signIn(username) of signIn(username, password) methode wilt afhandelen, gebruikt u het volgende codefragment:

val actionResult = authClient.sign(
    username = emailAddress
    //password = password, Pass 'password' param if you sign in with username (email) and password
)
if (actionResult is SignInResult.CodeRequired) {
    // Next step: submit code
} else if (actionResult is SignInError) {
    // Handle sign in errors
    when {
         actionResult.isUserNotFound() -> {
             // Handle "user not found" error
         }
         actionResult.isAuthNotSupported() -> {
         // Handle "authentication type not support" error
         }
         actionResult.isInvalidCredentials() -> {
             // Handle specific errors
         }
         else -> {
             // Handle other errors
         }
     }
}
  • SignInError geeft een mislukt actieresultaat aan dat is geretourneerd door signIn(), dus het actieresultaat bevat geen verwijzing naar de nieuwe status.
  • Als actionResult is SignUpError, de Android SDK biedt hulpprogrammamethoden waarmee u de specifieke fouten verder kunt analyseren:
    • De methode isUserNotFound() controleert of de gebruiker zich aanmeldt met een gebruikersnaam (e-mailadres) die niet bestaat.
    • De methode isBrowserRequired() controleert de noodzaak van een browser (webback) om de verificatiestroom te voltooien. Dit scenario treedt op wanneer systeemeigen verificatie niet voldoende is om de verificatiestroom te voltooien. Een beheerder configureert bijvoorbeeld e-mail en wachtwoord als verificatiemethode, maar de app kan geen wachtwoord verzenden als een uitdagingstype of ondersteunt het gewoon niet. Gebruik de stappen in de ondersteuningswebback in de Android-app om scenario's af te handelen wanneer dit gebeurt.
    • De methode isAuthNotSupported() controleert of de app een vraagtype verzendt dat niet door Microsoft Entra wordt ondersteund. Dit is een andere waarde voor het type uitdaging dan oob en wachtwoord. Meer informatie over uitdagingstypen.
    • Voor aanmelding met gebruikersnaam (e-mail) en wachtwoord controleert de methode isInvalidCredentials() of de combinatie van gebruikersnaam en wachtwoord onjuist is.

Codefouten verwerken

Gebruik het volgende codefragment om fouten in submitCode() de methode te verwerken:

val submitCodeActionResult = nextState.submitCode(
    code = code
)
if (submitCodeActionResult is SignInResult.Complete) {
    // Sign in flow complete, handle success state.
} else if (submitCodeActionResult is SubmitCodeError && submitCodeActionResult.isInvalidCode()) {
    // Handle "invalid code" error
}
  • De SubmitCodeError fout geeft een mislukt actieresultaat aan dat is geretourneerd door submitCode() en dus bevat het actieresultaat geen verwijzing naar de nieuwe status.
  • De isInvalidCode() controles op de specifieke fout. In dit geval moet de vorige statusverwijzing worden gebruikt om de actie opnieuw uit te voeren.

Als u de nieuwe wachtwoordcode voor eenmalige e-mail wilt ophalen, gebruikt u het volgende codefragment:

val submitCodeActionResult = nextState.submitCode(
    code = code
)
if (submitCodeActionResult is SignInError && submitCodeActionResult.isInvalidCode) {
    // Inform the user that the submitted code was incorrect or invalid, then ask them to input a new email one-time passcode
    val newCode = retrieveNewCode()
    nextState.submitCode(
        code = newCode
    )
}

U hebt alle benodigde stappen voltooid om u aan te melden bij een gebruiker in uw app. Bouw uw toepassing en voer deze uit. Als alles goed is, moet u een e-mailbericht kunnen opgeven, een code op het e-mailbericht kunnen ontvangen en deze gebruiken om de gebruiker aan te melden.

Id-tokenclaims lezen

Zodra uw app een id-token heeft verkregen, kunt u de claims ophalen die zijn gekoppeld aan het huidige account. Gebruik hiervoor het volgende codefragment.

val preferredUsername = accountState.getClaims()?.get("preferred_username")
val city = accountState.getClaims()?.get("City")
val givenName = accountState.getClaims()?.get("given_name")
//custom attribute
val loyaltyNumber = accountState.getClaims()?.get("loyaltyNumber")

De sleutel die u gebruikt voor toegang tot de claimwaarde is de naam die u opgeeft wanneer u het gebruikerskenmerk toevoegt als een tokenclaim.

Als u wilt weten hoe u ingebouwde en aangepaste kenmerken toevoegt als tokenclaims in het artikel Gebruikerskenmerken toevoegen aan tokenclaims .

Een gebruiker afmelden

Als u een gebruiker wilt afmelden, moet u het account verwijderen dat momenteel in de cache is opgeslagen.

  1. Maak uw aangepaste gebruikersinterface (UI) met:

    • Een afmeldingsknop die de gebruiker selecteert om een afmeldingsaanvraag te verzenden.
  2. Gebruik de volgende code om een gebruiker af te melden:

    private fun performSignOut(accountState: AccountState) {
         CoroutineScope(Dispatchers.Main).launch {
            val accountResult = authClient.getCurrentAccount()
             if (accountResult is GetAccountResult.AccountFound) {
                 val signOutResult = accountResult.resultValue.signOut()
                 if (signOutResult is SignOutResult.Complete) {
                     // Show sign out successful UI
                 }
             }
         }
     }
    

Afmeldingsfouten afhandelen

Afmelden moet foutloos zijn. Als er fouten optreden, controleert u het foutresultaat met behulp van het volgende codefragment:

val actionResult = accountResult.signOut()
if (actionResult is SignOutResult.Complete) {
    // Show sign out successful UI
} else {
    // Handle errors
}

Zorg ervoor dat u de importinstructies opneemt. Android Studio moet automatisch de importinstructies voor u bevatten.

U hebt alle benodigde stappen voltooid om een gebruiker af te melden in uw app. Bouw uw toepassing en voer deze uit. Als alles goed is, kunt u de knop Afmelden selecteren om u af te melden.

Aangepaste claimprovider configureren

Als u claims van een extern systeem wilt toevoegen aan het token dat is uitgegeven aan uw app, gebruikt u een aangepaste claimprovider. Een aangepaste claimprovider bestaat uit een aangepaste verificatie-extensie die een externe REST API aanroept om claims op te halen uit externe systemen.

Volg de stappen in Een aangepaste claimprovider configureren om claims van een extern systeem toe te voegen aan uw beveiligingstokens.