Dela via


Självstudie: Lägga till inloggning i Android-appen med inbyggd autentisering

Den här självstudien visar hur du loggar in och loggar ut en användare med engångslösenord för e-post eller användarnamn och lösenord i din Android-mobilapp med inbyggd autentisering.

I den här självstudien lär du dig att:

  • Logga in en användare med e-postlösenord eller användarnamn (e-post) och lösenord.
  • Logga ut en användare.
  • Hantera inloggningsfel

Förutsättningar

Logga in en användare

Om du vill logga in en användare med engångslösenordet samlar du in e-postmeddelandet och skickar ett e-postmeddelande som innehåller ett engångslösenord för användaren för att verifiera deras e-post. När användaren anger ett giltigt engångslösenord loggar appen in dem.

Om du vill logga in en användare med användarnamn (e-post) och lösenord samlar du in e-postmeddelandet och lösenordet från användaren. Om användarnamnet och lösenordet är giltiga loggar appen in användaren.

Om du vill logga in på en användare måste du:

  1. Skapa ett användargränssnitt (UI) för att:

    • Samla in ett e-postmeddelande från användaren. Lägg till validering i dina indata för att se till att användaren anger en giltig e-postadress.
    • Samla in ett lösenord om du loggar in med användarnamn (e-post) och lösenord.
    • Samla in ett engångslösenord för e-post från användaren om du loggar in med engångslösenord för e-post.
    • Skicka engångslösenordet igen (rekommenderas) om du loggar in med engångslösenord via e-post.
  2. I användargränssnittet lägger du till en knapp vars select-händelse startar en inloggning enligt följande kodfragment:

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

    Om användaren inte behöver skicka ett lösenord, till exempel var en användare loggar in med e-post och lösenord, använder du följande kodfragment:

        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()
                    }
            }
        }
    
    • Om du vill starta inloggningsflödet använder du SDK:t eller signIn(username) signIn(username, password) -metoden.
    • Metodens parameter username är sedan den e-postadress som du samlar in från användaren.
    • Om inloggningsmetoden är användarnamn (e-post) och lösenord, metodens parameter, password är lösenordet som du samlar in från användaren.
    • I det vanligaste scenariot signIn(username) returnerar eller signIn(username, password)ett resultat, SignInResult.CodeRequired, vilket anger att SDK förväntar sig att appen skickar e-postmeddelandet engångslösenordet som skickas till användarens e-postadress.
    • Objektet SignInResult.CodeRequired innehåller en ny tillståndsreferens som vi kan hämta via actionResult.nextState.
    • Det nya tillståndet ger oss tillgång till två nya metoder:
      • submitCode() skickar e-postmeddelandet engångslösenordet som appen samlar in från användaren.
      • resendCode() skickar e-postmeddelandet engångslösenordet igen om användaren inte tar emot koden.

Hantera inloggningsfel

Under inloggningen lyckas inte alla åtgärder. Användaren kan till exempel försöka logga in med en e-postadress som inte finns eller skicka en ogiltig kod.

Hantera inloggningsstartfel

Om du vill hantera fel i signIn(username) metoden eller signIn(username, password) använder du följande kodfragment:

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 anger ett misslyckat åtgärdsresultat som returneras av signIn(), så att åtgärdsresultatet inte innehåller någon referens till det nya tillståndet.
  • Om actionResult is SignUpErrorinnehåller Android SDK verktygsmetoder så att du kan analysera de specifika felen ytterligare:
    • Metoden isUserNotFound() kontrollerar om användaren loggar in med ett användarnamn (e-postadress) som inte finns.
    • Metoden isBrowserRequired() kontrollerar behovet av en webbläsare (webbåterställning) för att slutföra autentiseringsflödet. Det här scenariot inträffar när intern autentisering inte räcker för att slutföra autentiseringsflödet. Till exempel konfigurerar en administratör e-post och lösenord som autentiseringsmetod, men appen kan inte skicka lösenord som en utmaningstyp eller helt enkelt inte stöder det. Använd stegen i Stöd för webbåterställning i Android-appen för att hantera scenariot när det händer.
    • Metoden isAuthNotSupported() kontrollerar om appen skickar en utmaningstyp som Microsoft Entra inte stöder, det är ett annat utmaningstypvärde än oob och lösenord. Läs mer om utmaningstyper.
    • För användarnamn (e-post) och lösenordsinloggning kontrollerar metoden isInvalidCredentials() om kombinationen av användarnamn och lösenord är felaktig.

Hantera fel med skickad kod

Om du vill hantera fel i submitCode() metoden använder du följande kodfragment:

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
}
  • Felet SubmitCodeError anger ett misslyckat åtgärdsresultat som returneras av submitCode() och därför innehåller inte åtgärdsresultatet någon referens till det nya tillståndet.
  • Söker isInvalidCode() efter det specifika felet. I det här fallet måste den tidigare tillståndsreferensen användas för att omformforma åtgärden.

Om du vill hämta det nya engångslösenordet för e-post använder du följande kodfragment:

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

Du har slutfört alla nödvändiga steg för att logga in en användare i din app. Skapa och kör ditt program. Om allt är bra bör du kunna ange ett e-postmeddelande, ta emot en kod i e-postmeddelandet och använda den för att logga in användaren.

Läs-ID-tokenanspråk

När appen har hämtat en ID-token kan du hämta anspråken som är associerade med det aktuella kontot. Om du vill göra det använder du följande kodfragment.

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")

Nyckeln som du använder för att komma åt anspråksvärdet är det namn som du anger när du lägger till användarattributet som ett tokenanspråk.

Lär dig hur du lägger till inbyggda och anpassade attribut som tokenanspråk i artikeln Lägg till användarattribut till tokenanspråk .

Logga ut en användare

Om du vill logga ut en användare måste du ta bort det konto som för närvarande lagras i cacheminnet.

  1. Skapa ditt anpassade användargränssnitt (UI) som innehåller:

    • En utloggningsknapp som användaren väljer för att skicka en utloggningsbegäran.
  2. Om du vill logga ut en användare använder du följande kod:

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

Hantera utloggningsfel

Utloggning bör vara felfri. Om det uppstår fel kontrollerar du felresultatet med hjälp av följande kodfragment:

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

Se till att du inkluderar importinstruktionerna. Android Studio bör inkludera importinstruktionerna automatiskt.

Du har slutfört alla nödvändiga steg för att logga ut en användare i din app. Skapa och kör ditt program. Om allt är bra bör du kunna välja utloggningsknappen för att logga ut.

Konfigurera anpassad anspråksprovider

Om du vill lägga till anspråk från ett externt system i den token som utfärdas till din app använder du en anpassad anspråksprovider. En anpassad anspråksprovider består av ett anpassat autentiseringstillägg som anropar ett externt REST API för att hämta anspråk från externa system.

Följ stegen i Konfigurera en anpassad anspråksprovider för att lägga till anspråk från ett externt system i dina säkerhetstoken.