Udostępnij za pośrednictwem


Samouczek: dodawanie aplikacji logowania w systemie Android przy użyciu uwierzytelniania natywnego

W tym samouczku pokazano, jak zalogować się i wylogować użytkownika przy użyciu jednorazowego kodu dostępu lub nazwy użytkownika lub nazwy użytkownika i hasła w aplikacji mobilnej systemu Android przy użyciu uwierzytelniania natywnego.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Zaloguj się do użytkownika przy użyciu jednorazowego kodu dostępu lub nazwy użytkownika (e-mail) i hasła.
  • Wyloguj użytkownika.
  • Błąd obsługi logowania

Wymagania wstępne

Logowanie użytkownika

Aby zalogować się do użytkownika przy użyciu jednorazowego kodu dostępu, zbierz wiadomość e-mail i wyślij wiadomość e-mail zawierającą jednorazowy kod dostępu dla użytkownika, aby zweryfikować swoją wiadomość e-mail. Gdy użytkownik wprowadzi prawidłowy jednorazowy kod dostępu, aplikacja je zaloguje.

Aby zalogować użytkownika przy użyciu nazwy użytkownika (wiadomości e-mail) i hasła, zbierz wiadomość e-mail i hasło od użytkownika. Jeśli nazwa użytkownika i hasło są prawidłowe, aplikacja loguje się do użytkownika.

Aby zalogować użytkownika, musisz:

  1. Utwórz interfejs użytkownika w celu:

    • Zbierz wiadomość e-mail od użytkownika. Dodaj walidację do danych wejściowych, aby upewnić się, że użytkownik wprowadzi prawidłowy adres e-mail.
    • Zbierz hasło, jeśli zalogujesz się przy użyciu nazwy użytkownika (e-mail) i hasła.
    • Zbierz jednorazowy kod dostępu wiadomości e-mail od użytkownika, jeśli logujesz się przy użyciu jednorazowego kodu dostępu poczty e-mail.
    • Wyślij ponownie jednorazowy kod dostępu (zalecane), jeśli logujesz się przy użyciu jednorazowego kodu dostępu poczty e-mail.
  2. W interfejsie użytkownika dodaj przycisk, którego zdarzenie select uruchamia logowanie, jak pokazano w poniższym fragmencie kodu:

     CoroutineScope(Dispatchers.Main).launch {
         val actionResult = authClient.signIn(
             username = emailAddress
             //password = password, Pass 'password' param if you sign in with username (email) and password
         )
         if (actionResult is SignInResult.CodeRequired) {
             val nextState = actionResult.nextState
             val submitCodeActionResult = nextState.submitCode(
                 code = code
             )
             if (submitCodeActionResult is SignInResult.Complete){
                 // Handle sign in success
                 val accountState = submitCodeActionResult.resultValue
                 val accessTokenResult = accountState.getAccessToken()
                 if (accessTokenResult is GetAccessTokenResult.Complete) {
                     val accessToken = accessTokenResult.resultValue.accessToken
                     val idToken = accountState.getIdToken()
                 }
             }
         }
     }
    

    Jeśli użytkownik nie jest wymagany do przesłania kodu dostępu, takiego jak miejsce logowania użytkownika za pomocą poczty e-mail i hasła, użyj następującego fragmentu kodu:

        CoroutineScope(Dispatchers.Main).launch {
            val actionResult = authClient.signIn(
                username = emailAddress,
                password = password
            )
            if (actionResult is SignInResult.Complete) -> {
                // Handle sign in success
                val accountState = actionResult.resultValue
                val accessTokenResult = accountState.getAccessToken()
                if (accessTokenResult is GetAccessTokenResult.Complete) {
                        val accessToken = accessTokenResult.resultValue.accessToken
                        val idToken = accountState.getIdToken()
                    }
            }
        }
    
    • Aby uruchomić przepływ logowania, użyj metody lub signIn(username, password) zestawu SDKsignIn(username).
    • Parametr username metody to adres e-mail zbierany od użytkownika.
    • Jeśli metoda logowania to nazwa użytkownika (adres e-mail) i hasło, parametr password metody to hasło zbierane od użytkownika.
    • W najbardziej typowym scenariuszu signIn(username) metoda lub signIn(username, password)zwraca wynik , który wskazuje, SignInResult.CodeRequiredże zestaw SDK oczekuje, że aplikacja będzie przesyłać jednorazowy kod dostępu do wiadomości e-mail wysłany na adres e-mail użytkownika.
    • Obiekt SignInResult.CodeRequired zawiera nowe odwołanie do stanu, które możemy pobrać za pomocą actionResult.nextStatepolecenia .
    • Nowy stan daje nam dostęp do dwóch nowych metod:
      • submitCode() przesyła jednorazowy kod dostępu wiadomości e-mail zbierany przez aplikację od użytkownika.
      • resendCode() wysyła ponownie kod dostępu jednorazowego wiadomości e-mail, jeśli użytkownik nie otrzyma kodu.

Obsługa błędów logowania

Podczas logowania nie wszystkie akcje kończą się powodzeniem. Na przykład użytkownik może spróbować zalogować się przy użyciu adresu e-mail, który nie istnieje lub przesłać nieprawidłowy kod.

Obsługa błędów uruchamiania logowania

Aby obsłużyć błędy w metodzie signIn(username) lub signIn(username, password) , użyj następującego fragmentu kodu:

val actionResult = authClient.sign(
    username = emailAddress
    //password = password, Pass 'password' param if you sign in with username (email) and password
)
if (actionResult is SignInResult.CodeRequired) {
    // Next step: submit code
} else if (actionResult is SignInError) {
    // Handle sign in errors
    when {
         actionResult.isUserNotFound() -> {
             // Handle "user not found" error
         }
         actionResult.isAuthNotSupported() -> {
         // Handle "authentication type not support" error
         }
         actionResult.isInvalidCredentials() -> {
             // Handle specific errors
         }
         else -> {
             // Handle other errors
         }
     }
}
  • SignInError wskazuje wynik nieudanej akcji zwrócony przez signIn()element , więc wynik akcji nie zawiera odwołania do nowego stanu.
  • Jeśli actionResult is SignUpErrorzestaw SDK systemu Android udostępnia metody narzędziowe umożliwiające dalsze analizowanie określonych błędów:
    • Metoda isUserNotFound() sprawdza, czy użytkownik loguje się przy użyciu nazwy użytkownika (adresu e-mail), która nie istnieje.
    • Metoda isBrowserRequired() sprawdza potrzebę korzystania z przeglądarki (rezerwowego internetowego) w celu ukończenia przepływu uwierzytelniania. Ten scenariusz występuje, gdy uwierzytelnianie natywne nie jest wystarczające do ukończenia przepływu uwierzytelniania. Na przykład administrator konfiguruje adres e-mail i hasło jako metodę uwierzytelniania, ale aplikacja nie może wysłać hasła jako typu wyzwania lub po prostu nie obsługuje go. Wykonaj kroki opisane w temacie Obsługa rezerwowego w internecie w aplikacji dla systemu Android, aby obsłużyć scenariusz w takim przypadku.
    • Metoda isAuthNotSupported() sprawdza, czy aplikacja wysyła typ wyzwania, którego firma Microsoft Entra nie obsługuje, jest to wartość typu wyzwania inna niż oob i hasło. Dowiedz się więcej o typach wyzwań.
    • W przypadku nazwy użytkownika (poczty e-mail) i logowania przy użyciu hasła metoda isInvalidCredentials() sprawdza, czy kombinacja nazwy użytkownika i hasła jest niepoprawna.

Obsługa błędów przesyłania kodu

Aby obsłużyć błędy w submitCode() metodzie, użyj następującego fragmentu kodu:

val submitCodeActionResult = nextState.submitCode(
    code = code
)
if (submitCodeActionResult is SignInResult.Complete) {
    // Sign in flow complete, handle success state.
} else if (submitCodeActionResult is SubmitCodeError && submitCodeActionResult.isInvalidCode()) {
    // Handle "invalid code" error
}
  • Błąd SubmitCodeError wskazuje wynik nieudanej akcji zwrócony przez submitCode() element i dlatego wynik akcji nie zawiera odwołania do nowego stanu.
  • Sprawdza isInvalidCode() określony błąd. W takim przypadku należy użyć poprzedniego odwołania do stanu w celu ponownego wykonania akcji.

Aby pobrać nowy kod dostępu jednorazowego wiadomości e-mail, użyj następującego fragmentu kodu:

val submitCodeActionResult = nextState.submitCode(
    code = code
)
if (submitCodeActionResult is SignInError && submitCodeActionResult.isInvalidCode) {
    // Inform the user that the submitted code was incorrect or invalid, then ask them to input a new email one-time passcode
    val newCode = retrieveNewCode()
    nextState.submitCode(
        code = newCode
    )
}

Wszystkie kroki niezbędne do pomyślnego zalogowania użytkownika w aplikacji zostały wykonane. Skompiluj i uruchom aplikację. Jeśli wszystko jest dobre, powinno być możliwe podanie wiadomości e-mail, otrzymanie kodu w wiadomości e-mail i użycie jej do pomyślnego zalogowania użytkownika.

Oświadczenia tokenu identyfikatora odczytu

Gdy aplikacja uzyska token identyfikatora, możesz pobrać oświadczenia skojarzone z bieżącym kontem. W tym celu użyj następującego fragmentu kodu.

val preferredUsername = accountState.getClaims()?.get("preferred_username")
val city = accountState.getClaims()?.get("City")
val givenName = accountState.getClaims()?.get("given_name")
//custom attribute
val loyaltyNumber = accountState.getClaims()?.get("loyaltyNumber")

Klucz używany do uzyskiwania dostępu do wartości oświadczenia to nazwa określona podczas dodawania atrybutu użytkownika jako oświadczenia tokenu.

Aby dowiedzieć się, jak dodać wbudowane i niestandardowe atrybuty jako oświadczenia tokenu w artykule Dodawanie atrybutów użytkownika do oświadczeń tokenu .

Wylogowywanie użytkownika

Aby wylogować użytkownika, musisz usunąć konto obecnie przechowywane w pamięci podręcznej.

  1. Utwórz niestandardowy interfejs użytkownika( UI), który obejmuje:

    • Przycisk wyloguj się, który użytkownik wybierze, aby wysłać żądanie wylogowania.
  2. Aby wylogować użytkownika, użyj następującego kodu:

    private fun performSignOut(accountState: AccountState) {
         CoroutineScope(Dispatchers.Main).launch {
            val accountResult = authClient.getCurrentAccount()
             if (accountResult is GetAccountResult.AccountFound) {
                 val signOutResult = accountResult.resultValue.signOut()
                 if (signOutResult is SignOutResult.Complete) {
                     // Show sign out successful UI
                 }
             }
         }
     }
    

Obsługa błędów wylogowywanie

Wylogowywanie powinno być wolne od błędów. Jeśli wystąpią jakiekolwiek błędy, sprawdź wynik błędu przy użyciu następującego fragmentu kodu:

val actionResult = accountResult.signOut()
if (actionResult is SignOutResult.Complete) {
    // Show sign out successful UI
} else {
    // Handle errors
}

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

Wszystkie kroki niezbędne do pomyślnego wylogowania użytkownika w aplikacji zostały wykonane. Skompiluj i uruchom aplikację. Jeśli wszystko jest dobre, możesz wybrać przycisk wyloguj się, aby pomyślnie się wylogować.

Konfigurowanie niestandardowego dostawcy oświadczeń

Jeśli chcesz dodać oświadczenia z systemu zewnętrznego do tokenu wystawionego dla aplikacji, użyj niestandardowego dostawcy oświadczeń. Niestandardowy dostawca oświadczeń składa się z niestandardowego rozszerzenia uwierzytelniania, które wywołuje zewnętrzny interfejs API REST w celu pobierania oświadczeń z systemów zewnętrznych.

Wykonaj kroki opisane w temacie Konfigurowanie niestandardowego dostawcy oświadczeń, aby dodać oświadczenia z systemu zewnętrznego do tokenów zabezpieczających.