Udostępnij za pośrednictwem


Samouczek: logowanie użytkowników w aplikacji mobilnej Dla systemu Android (Kotlin)

Jest to trzeci samouczek z serii samouczków, który przeprowadzi Cię przez proces logowania użytkowników przy użyciu Tożsamość zewnętrzna Microsoft Entra.

W tym samouczku wykonasz następujące elementy:

  • Logowanie użytkownika
  • Wyloguj użytkownika

Wymagania wstępne

Samouczek: przygotowywanie aplikacji systemu Android do uwierzytelniania.

Logowanie użytkownika

Istnieją dwie główne opcje logowania użytkowników przy użyciu biblioteki Microsoft Authentication Library (MSAL) dla systemu Android: uzyskiwanie tokenów interaktywnie lub dyskretnie.

  1. Aby interaktywnie zalogować się użytkownika, użyj następującego kodu:

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

    Kod inicjuje proces uzyskiwania tokenu interaktywnie przy użyciu biblioteki MSAL dla systemu Android. Najpierw wyczyszczy pole dziennika tekstu. Następnie sprawdza, czy jest już zalogowane konto, jeśli tak, wyświetla wyskakujący komunikat wskazujący, że konto jest już zalogowane i zwraca.

    Następnie wyodrębnia zakresy z danych wejściowych tekstu i konwertuje je na małe litery przed podzieleniem ich na tablicę. Korzystając z tych zakresów, tworzy parametry uzyskiwania tokenu, w tym uruchamianie procesu autoryzacji z bieżącego działania i określanie wywołania zwrotnego. Na koniec wywołuje acquireToken() klienta uwierzytelniania z skonstruowanymi parametrami w celu zainicjowania procesu pozyskiwania tokenu.

    W kodzie, w którym określamy wywołanie zwrotne, używamy funkcji o nazwie getAuthInteractiveCallback(). Funkcja powinna mieć następujący kod:

    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 kodu definiuje funkcję , getAuthInteractiveCallbackktóra zwraca wystąpienie klasy AuthenticationCallback. W ramach tej funkcji jest tworzona anonimowa klasa implementowania interfejsu AuthenticationCallback .

    Po pomyślnym uwierzytelnieniu (onSuccess) rejestruje pomyślne uwierzytelnianie, pobiera token identyfikatora i oświadczenia, aktualizuje token dostępu asynchronicznie przy użyciu polecenia i aktualizuje interfejs użytkownika przy użyciu CoroutineScopenowego tokenu dostępu. Kod pobiera token identyfikatora z obiektu authenticationResult i rejestruje go. Oświadczenia w tokenie zawierają informacje o użytkowniku, takie jak ich nazwa, adres e-mail lub inne informacje o profilu. Oświadczenia skojarzone z bieżącym kontem można pobrać, korzystając z polecenia authenticationResult.account.claims.

    Jeśli wystąpi błąd uwierzytelniania (onError), rejestruje błąd, czyści token dostępu, aktualizuje interfejs użytkownika za pomocą komunikatu o błędzie i zapewnia bardziej szczegółową obsługę poleceń MsalClientException i MsalServiceException. Jeśli użytkownik anuluje uwierzytelnianie (onCancel), rejestruje anulowanie.

    Upewnij się, że dołączysz instrukcje importowania. Program Android Studio powinien automatycznie dołączać instrukcje importowania.

  2. Aby zalogować użytkownika w trybie dyskretnym, użyj następującego kodu:

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

    Kod inicjuje proces uzyskiwania tokenu w trybie dyskretnym. Najpierw wyczyszczy dziennik tekstowy. Następnie sprawdza, czy istnieje dostępne konto; Jeśli tak nie jest, zostanie wyświetlony wyskakujące komunikat informujący o tym i kończy działanie. Następnie wyodrębnia zakresy z wprowadzania tekstu, konwertuje je na małe litery i dzieli je na tablicę.

    Korzystając z tych zakresów, tworzy parametry uzyskiwania tokenu w trybie dyskretnym, określając konto, urząd, zakresy i wywołanie zwrotne. Na koniec asynchronicznie wyzwala na kliencie acquireTokenSilentAsync() uwierzytelniania z skonstruowanymi parametrami, rozpoczynając proces pozyskiwania tokenu dyskretnego.

    W kodzie, w którym określamy wywołanie zwrotne, używamy funkcji o nazwie getAuthSilentCallback(). Funkcja powinna mieć następujący kod:

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

    Kod definiuje wywołanie zwrotne na potrzeby uwierzytelniania dyskretnego. Implementuje SilentAuthenticationCallback interfejs, przesłaniając dwie metody. W metodzie onSuccess rejestruje pomyślne uwierzytelnianie i wyświetla token dostępu.

    W metodzie onError rejestruje błąd uwierzytelniania, obsługuje różne typy wyjątków, takich jak MsalClientException i MsalServiceException, i sugeruje ponowienie próby z uwierzytelnianiem interakcyjnym, jeśli jest to konieczne.

    Upewnij się, że dołączysz instrukcje importowania. Program Android Studio powinien automatycznie dołączać instrukcje importowania.

Wyloguj się

Aby wylogować użytkownika z aplikacji systemu Android (Kotlin) przy użyciu biblioteki MSAL dla systemu Android, użyj następującego kodu:

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

    authClient.signOut(signOutCallback())
}

Kod usuwa konto z aplikacji. Czyści wyświetlaną nazwę użytkownika i dziennik tekstowy. Następnie wyzwala proces wylogowywanie przy użyciu klienta uwierzytelniania, określając wywołanie zwrotne wylogowania w celu obsługi ukończenia operacji wylogowania.

W kodzie, w którym określamy wywołanie zwrotne, używamy funkcji o nazwie signOutCallback(). Funkcja powinna mieć następujący kod:

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

Kod definiuje wywołanie zwrotne wylogowania dla pojedynczego konta w publicznej aplikacji klienckiej. Implementuje ISingleAccountPublicClientApplication.SignOutCallback interfejs, przesłaniając dwie metody.

W metodzie onSignOut nullififuje bieżące konto i aktualizuje odpowiednio interfejs użytkownika. W metodzie onError rejestruje wszelkie błędy występujące podczas procesu wylogowywanie i aktualizuje dziennik tekstowy z odpowiednim komunikatem o wyjątku.

Upewnij się, że dołączysz instrukcje importowania. Program Android Studio powinien automatycznie dołączać instrukcje importowania.

Następne kroki

Samouczek: wywoływanie chronionego internetowego interfejsu API w aplikacji Systemu Android (Kotlin).