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.
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ę ,
getAuthInteractiveCallback
która zwraca wystąpienie klasyAuthenticationCallback
. W ramach tej funkcji jest tworzona anonimowa klasa implementowania interfejsuAuthenticationCallback
.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życiuCoroutineScope
nowego tokenu dostępu. Kod pobiera token identyfikatora z obiektuauthenticationResult
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 poleceniaauthenticationResult.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
iMsalServiceException
. 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.
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 metodzieonSuccess
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 jakMsalClientException
iMsalServiceException
, 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).