Sdílet prostřednictvím


Kurz: Přihlášení uživatelů v mobilní aplikaci Android (Kotlin)

Toto je třetí kurz série kurzů, který vás provede přihlašováním uživatelů pomocí Microsoft Entra Externí ID.

V tomto kurzu:

  • Přihlášení uživatele
  • Odhlásit uživatele

Požadavky

Kurz: Příprava aplikace pro Android na ověřování

Přihlášení uživatele

Máte dvě hlavní možnosti pro přihlašování uživatelů pomocí knihovny MICROSOFT Authentication Library (MSAL) pro Android: interaktivní nebo tiché získání tokenů.

  1. Pokud se chcete přihlásit uživatele interaktivně, použijte následující kód:

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

    Kód zahájí proces získání tokenu interaktivně pomocí knihovny MSAL pro Android. Nejprve vymaže pole textového protokolu. Pak zkontroluje, jestli už existuje přihlášený účet, pokud ano, zobrazí se zpráva informační zprávy s informací, že účet je již přihlášený a vrací se.

    Dále extrahuje obory z textového vstupu a před jejich rozdělením na pole je převede na malá písmena. Pomocí těchto oborů sestaví parametry pro získání tokenu, včetně spuštění procesu autorizace z aktuální aktivity a zadání zpětného volání. Nakonec zavolá acquireToken() ověřovacího klienta s vytvořenými parametry, aby zahájil proces získání tokenu.

    V kódu, kde zadáme zpětné volání, použijeme funkci s názvem getAuthInteractiveCallback(). Funkce by měla mít následující kód:

    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.");
            }
        }
    }
    

    Fragment kódu definuje funkci, getAuthInteractiveCallbackkterá vrací instanci AuthenticationCallback. V rámci této funkce je vytvořena anonymní třída implementovaná AuthenticationCallback rozhraní.

    Pokud ověřování proběhne úspěšně (onSuccess), zaznamená úspěšné ověření, načte token ID a deklarace identity, aktualizuje přístupový token asynchronně pomocí CoroutineScopea aktualizuje uživatelské rozhraní pomocí nového přístupového tokenu. Kód načte token ID a zaprokoluje ho authenticationResult . Deklarace identity v tokenu obsahují informace o uživateli, například jméno, e-mail nebo jiné informace o profilu. Deklarace identity přidružené k aktuálnímu účtu můžete načíst pomocí authenticationResult.account.claimspřístupu .

    Pokud dojde k chybě ověřování (onError), zaprokoluje chybu, vymaže přístupový token, aktualizuje uživatelské rozhraní chybovou zprávou a poskytuje konkrétnější zpracování MsalClientException a MsalServiceException. Pokud uživatel zruší ověřování (onCancel), zaproprokoluje zrušení.

    Nezapomeňte zahrnout příkazy importu. Android Studio by měl automaticky obsahovat příkazy pro import.

  2. Pokud chcete uživatele přihlásit bezobslužně, použijte následující kód:

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

    Kód zahájí proces získání tokenu bezobslužně. Nejdřív vymaže textový protokol. Pak zkontroluje, jestli je k dispozici účet; Pokud ne, zobrazí se zpráva informační zprávy, která to znamená, a ukončí se. Dále extrahuje obory z textového vstupu, převede je na malá písmena a rozdělí je na pole.

    Pomocí těchto oborů vytvoří parametry pro získání tokenu bezobslužně, určení účtu, autority, oborů a zpětného volání. Nakonec se asynchronně aktivuje acquireTokenSilentAsync() u ověřovacího klienta s vytvořenými parametry a spustí proces získání tichého tokenu.

    V kódu, kde zadáme zpětné volání, použijeme funkci s názvem getAuthSilentCallback(). Funkce by měla mít následující kód:

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

    Kód definuje zpětné volání pro tiché ověřování. Implementuje SilentAuthenticationCallback rozhraní a přepisuje dvě metody. onSuccess V metodě protokoluje úspěšné ověření a zobrazí přístupový token.

    onError V metodě protokoluje selhání ověřování, zpracovává různé typy výjimek, například MsalClientException a MsalServiceException, a navrhuje opakování s interaktivním ověřováním v případě potřeby.

    Nezapomeňte zahrnout příkazy importu. Android Studio by měl automaticky obsahovat příkazy pro import.

Odhlásit se

Pokud chcete odhlásit uživatele z aplikace Android (Kotlin) pomocí KNIHOVNY MSAL pro Android, použijte následující kód:

private fun removeAccount() {
    binding.userName.text = ""
    binding.txtLog.text = ""

    authClient.signOut(signOutCallback())
}

Kód odebere účet z aplikace. Vymaže zobrazené uživatelské jméno a textový protokol. Potom aktivuje proces odhlášení pomocí ověřovacího klienta a určí zpětné volání odhlášení, které zpracuje dokončení operace odhlášení.

V kódu, kde zadáme zpětné volání, použijeme funkci s názvem signOutCallback(). Funkce by měla mít následující kód:

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

Kód definuje zpětné volání odhlášení pro jeden účet ve veřejné klientské aplikaci. Implementuje ISingleAccountPublicClientApplication.SignOutCallback rozhraní a přepisuje dvě metody.

onSignOut V metodě nullifuje aktuální účet a odpovídajícím způsobem aktualizuje uživatelské rozhraní. onError V metodě zaznamená všechny chyby, ke kterým dojde během procesu odhlášení, a aktualizuje textový protokol s odpovídající zprávou o výjimce.

Nezapomeňte zahrnout příkazy importu. Android Studio by měl automaticky obsahovat příkazy pro import.

Další kroky

Kurz: Volání chráněného webového rozhraní API v aplikaci Android (Kotlin).