Zelfstudie: Gebruikers aanmelden in de mobiele Android-app (Kotlin)
Dit is de derde zelfstudie in de reeks zelfstudies die u begeleidt bij het aanmelden van gebruikers met behulp van Microsoft Entra Externe ID.
In deze zelfstudie gaat u:
- Gebruiker aanmelden
- Gebruiker afmelden
Vereisten
Zelfstudie: Uw Android-app voorbereiden voor verificatie.
Gebruiker aanmelden
U hebt twee belangrijke opties voor het aanmelden van gebruikers met behulp van Microsoft Authentication Library (MSAL) voor Android: tokens interactief of op de achtergrond verkrijgen.
Gebruik de volgende code om de gebruiker interactief aan te melden:
private fun acquireTokenInteractively() { binding.txtLog.text = "" if (account != null) { Toast.makeText(this, "An account is already signed in.", Toast.LENGTH_SHORT).show() return } /* Extracts a scope array from text, i.e. from "User.Read User.ReadWrite" to ["user.read", "user.readwrite"] */ val scopes = scopes.lowercase().split(" ") val parameters = AcquireTokenParameters.Builder() .startAuthorizationFromActivity(this@MainActivity) .withScopes(scopes) .withCallback(getAuthInteractiveCallback()) .build() authClient.acquireToken(parameters) }
De code initieert het proces voor het interactief verkrijgen van een token met BEHULP van MSAL voor Android. Eerst wordt het tekstlogboekveld gewist. Vervolgens wordt gecontroleerd of er al een aangemeld account is, zo ja, wordt er een pop-upbericht weergegeven dat aangeeft dat een account al is aangemeld en retourneert.
Vervolgens worden bereiken geëxtraheerd uit tekstinvoer en geconverteerd naar kleine letters voordat ze worden gesplitst in een matrix. Met behulp van deze bereiken worden parameters gebouwd voor het verkrijgen van een token, waaronder het starten van het autorisatieproces van de huidige activiteit en het opgeven van een callback. Ten slotte roept
acquireToken()
het de verificatieclient aan met de samengestelde parameters om het tokenovernameproces te initiëren.In de code, waarin we onze callback opgeven, gebruiken we een functie die wordt aangeroepen
getAuthInteractiveCallback()
. De functie moet de volgende code hebben:private fun getAuthInteractiveCallback(): AuthenticationCallback { return object : AuthenticationCallback { override fun onSuccess(authenticationResult: IAuthenticationResult) { /* Successfully got a token, use it to call a protected resource - Web API */ Log.d(TAG, "Successfully authenticated") Log.d(TAG, "ID Token: " + authenticationResult.account.claims?.get("id_token")) Log.d(TAG, "Claims: " + authenticationResult.account.claims /* Reload account asynchronously to get the up-to-date list. */ CoroutineScope(Dispatchers.Main).launch { accessToken = authenticationResult.accessToken getAccount() binding.txtLog.text = getString(R.string.log_token_interactive) + accessToken } } override fun onError(exception: MsalException) { /* Failed to acquireToken */ Log.d(TAG, "Authentication failed: $exception") accessToken = null binding.txtLog.text = getString(R.string.exception_authentication) + exception if (exception is MsalClientException) { /* Exception inside MSAL, more info inside MsalError.java */ } else if (exception is MsalServiceException) { /* Exception when communicating with the STS, likely config issue */ } } override fun onCancel() { /* User canceled the authentication */ Log.d(TAG, "User cancelled login."); } } }
Het codefragment definieert een functie,
getAuthInteractiveCallback
die een exemplaar vanAuthenticationCallback
. Binnen deze functie wordt een anonieme klasse gemaakt die deAuthenticationCallback
interface implementeert.Wanneer verificatie slaagt (
onSuccess
), registreert deze de geslaagde verificatie, haalt het id-token en claims op, werkt het toegangstoken asynchroon bij met behulp vanCoroutineScope
en werkt de gebruikersinterface bij met het nieuwe toegangstoken. De code haalt het id-token op uit deauthenticationResult
code en registreert het. Claims in het token bevatten informatie over de gebruiker, zoals hun naam, e-mail of andere profielgegevens. U kunt de claims ophalen die zijn gekoppeld aan het huidige account door toegang te krijgenauthenticationResult.account.claims
tot .Als er een verificatiefout is (
onError
), wordt de fout opgeslagen, wordt het toegangstoken gewist, wordt de gebruikersinterface bijgewerkt met het foutbericht en wordt er specifiekere verwerking geboden voorMsalClientException
enMsalServiceException
. Als de gebruiker de verificatie annuleert (onCancel
), registreert deze de annulering.Zorg ervoor dat u de importinstructies opneemt. Android Studio moet automatisch de importinstructies voor u bevatten.
Gebruik de volgende code om de gebruiker op de achtergrond aan te melden:
private fun acquireTokenSilently() { binding.txtLog.text = "" if (account == null) { Toast.makeText(this, "No account available", Toast.LENGTH_SHORT).show() return } /* Extracts a scope array from text, i.e. from "User.Read User.ReadWrite" to ["user.read", "user.readwrite"] */ val scopes = scopes.lowercase().split(" ") val parameters = AcquireTokenSilentParameters.Builder() .forAccount(account) .fromAuthority(account!!.authority) .withScopes(scopes) .forceRefresh(false) .withCallback(getAuthSilentCallback()) .build() authClient.acquireTokenSilentAsync(parameters) }
De code initieert het proces van het verkrijgen van een token op de achtergrond. Eerst wordt het tekstlogboek gewist. Vervolgens wordt gecontroleerd of er een beschikbaar account is; Zo niet, dan wordt er een pop-upbericht weergegeven dat dit aangeeft en wordt afgesloten. Vervolgens worden bereiken geëxtraheerd uit tekstinvoer, geconverteerd naar kleine letters en gesplitst in een matrix.
Met behulp van deze bereiken worden parameters samengesteld voor het verkrijgen van een token op de achtergrond, waarbij het account, de instantie, de bereiken en callback worden opgegeven. Ten slotte wordt asynchroon geactiveerd
acquireTokenSilentAsync()
op de verificatieclient met de samengestelde parameters, waarbij het proces voor het verkrijgen van tokens op de achtergrond wordt gestart.In de code, waarin we onze callback opgeven, gebruiken we een functie die wordt aangeroepen
getAuthSilentCallback()
. De functie moet de volgende code hebben:private fun getAuthSilentCallback(): SilentAuthenticationCallback { return object : SilentAuthenticationCallback { override fun onSuccess(authenticationResult: IAuthenticationResult?) { Log.d(TAG, "Successfully authenticated") /* Display Access Token */ accessToken = authenticationResult?.accessToken binding.txtLog.text = getString(R.string.log_token_silent) + accessToken } override fun onError(exception: MsalException?) { /* Failed to acquireToken */ Log.d(TAG, "Authentication failed: $exception") accessToken = null binding.txtLog.text = getString(R.string.exception_authentication) + exception when (exception) { is MsalClientException -> { /* Exception inside MSAL, more info inside MsalError.java */ } is MsalServiceException -> { /* Exception when communicating with the STS, likely config issue */ } is MsalUiRequiredException -> { /* Tokens expired or no session, retry with interactive */ } } } } }
De code definieert een callback voor stille verificatie. De interface wordt geïmplementeerd
SilentAuthenticationCallback
, waarbij twee methoden worden overschreven. In deonSuccess
methode worden geslaagde verificatielogboeken en wordt het toegangstoken weergegeven.In de
onError
methode registreert het verificatiefout, verwerkt het verschillende soorten uitzonderingen, zoalsMsalClientException
enMsalServiceException
, en stelt het opnieuw proberen met interactieve verificatie voor, indien nodig.Zorg ervoor dat u de importinstructies opneemt. Android Studio moet automatisch de importinstructies voor u bevatten.
Afmelden
Als u een gebruiker wilt afmelden bij uw Android-app (Kotlin) met MSAL voor Android, gebruikt u de volgende code:
private fun removeAccount() {
binding.userName.text = ""
binding.txtLog.text = ""
authClient.signOut(signOutCallback())
}
Met de code wordt een account uit de toepassing verwijderd. Hiermee wordt de weergegeven gebruikersnaam en het tekstlogboek gewist. Vervolgens wordt het afmeldingsproces geactiveerd met behulp van de verificatieclient, waarbij een callback voor afmelden wordt opgegeven om de voltooiing van de afmeldingsbewerking af te handelen.
In de code, waarin we onze callback opgeven, gebruiken we een functie die wordt aangeroepen signOutCallback()
. De functie moet de volgende code hebben:
private fun signOutCallback(): ISingleAccountPublicClientApplication.SignOutCallback {
return object : ISingleAccountPublicClientApplication.SignOutCallback {
override fun onSignOut() {
account = null
updateUI(account)
}
override fun onError(exception: MsalException) {
binding.txtLog.text = getString(R.string.exception_remove_account) + exception
}
}
}
De code definieert een callback voor afmelden voor één account in de openbare clienttoepassing. De interface wordt geïmplementeerd ISingleAccountPublicClientApplication.SignOutCallback
, waarbij twee methoden worden overschreven.
In de onSignOut
methode wordt het huidige account nullifificeert en wordt de gebruikersinterface dienovereenkomstig bijgewerkt. In de onError
methode worden eventuele fouten vastgelegd die optreden tijdens het afmelden en wordt het tekstlogboek bijgewerkt met het bijbehorende uitzonderingsbericht.
Zorg ervoor dat u de importinstructies opneemt. Android Studio moet automatisch de importinstructies voor u bevatten.
Volgende stappen
Zelfstudie: Een beveiligde web-API aanroepen in de Android-app (Kotlin).