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
- Slutför stegen i Självstudie: Förbered din Android-app för intern autentisering. Den här självstudien visar hur du förbereder ditt Android-projekt eller din app för intern autentisering.
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:
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.
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 ellersignIn(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 viaactionResult.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.
- Om du vill starta inloggningsflödet använder du SDK:t eller
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 avsignIn()
, så att åtgärdsresultatet inte innehåller någon referens till det nya tillståndet.- Om
actionResult is SignUpError
innehå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.
- Metoden
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 avsubmitCode()
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.
Skapa ditt anpassade användargränssnitt (UI) som innehåller:
- En utloggningsknapp som användaren väljer för att skicka en utloggningsbegäran.
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.