Delen via


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.

  1. 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, getAuthInteractiveCallbackdie een exemplaar van AuthenticationCallback. Binnen deze functie wordt een anonieme klasse gemaakt die de AuthenticationCallback 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 van CoroutineScopeen werkt de gebruikersinterface bij met het nieuwe toegangstoken. De code haalt het id-token op uit de authenticationResult 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 krijgen authenticationResult.account.claimstot .

    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 voor MsalClientException en MsalServiceException. 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.

  2. 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 de onSuccess methode worden geslaagde verificatielogboeken en wordt het toegangstoken weergegeven.

    In de onError methode registreert het verificatiefout, verwerkt het verschillende soorten uitzonderingen, zoals MsalClientException en MsalServiceException, 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).