Samouczek: dodawanie rejestracji metody silnego uwierzytelniania sms do aplikacji systemu Android

W tym samouczku pokazano, jak zaimplementować rejestrację metody silnego uwierzytelniania SMS w aplikacji na Androida przy użyciu uwierzytelniania natywnego. Co najmniej jedno silne uwierzytelnianie jest obowiązkowe dla użytkowników z obsługą uwierzytelniania wieloskładnikowego (MFA). Obecnie obsługujemy tylko jednorazowy kod dostępu e-mail i SMS jako metodę silnego uwierzytelniania.

W tym poradniku nauczysz się, jak:

  • Zarejestruj metodę silnego uwierzytelniania dla użytkownika z obsługą uwierzytelniania wieloskładnikowego.
  • Obsługa błędów związanych z rejestracją metody silnego uwierzytelniania.

Wymagania wstępne

  1. Wykonaj kroki opisane w Samouczek: dodaj logowanie w aplikacji na Androida, używając natywnego uwierzytelniania.

  2. Aby wymusić uwierzytelnianie wieloskładnikowe dla klientów, wykonaj kroki opisane w artykule Dodawanie uwierzytelniania wieloskładnikowego do aplikacji, aby dodać usługę SMS MFA do przepływu logowania. Obecnie uwierzytelnianie natywne obsługuje hasło jednorazowe wysyłane na e-mail i SMS jako drugi czynnik w uwierzytelnianiu wieloskładnikowym.

  3. Jeśli chcesz zapoznać się z implementacją rejestracji metody silnego uwierzytelniania, przed rozpoczęciem rzuć okiem na naszą próbkę kodu.

Dodawanie rejestracji metody silnego uwierzytelniania do pliku konfiguracji klienta

Uwaga / Notatka

Obecnie występuje znany problem z jednorazowym kodem dostępu sms w formacie urzędu: <tenantSubdomain>.ciamlogin.com/<tenantSubdomain>.onmicrosoft.com w związku z tym należy użyć następującego formatu: <tenantSubdomain>.ciamlogin.com/<tenantID>

Aby obsługiwać metodę silnego uwierzytelniania, zaktualizuj konfigurację klienta systemu Android, aby uwzględnić wymagane możliwości rejestracji.

{
    "client_id": "Enter_the_Application_Id_Here",
    "authorities": [
    {
        "type": "CIAM",
        "authority_url": "https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/Enter_the_Tenant_Id_Here/"
    }
    ],
    "challenge_types": ["oob", "password"],
    "capabilities": ["registration_required"],
    "logging": {
    "pii_enabled": false,
    "log_level": "INFO",
    "logcat_enabled": true
    }
}

Rejestrowanie jednorazowego kodu dostępu sms jako metody silnego uwierzytelniania

Aby zarejestrować jednorazowy kod dostępu sms dla użytkownika z obsługą uwierzytelniania wieloskładnikowego, należy określić numer telefonu jako metodę silnego uwierzytelniania. Ten proces jest wyzwalany tylko po raz pierwszy, gdy uwierzytelnianie wieloskładnikowe jest wymagane, a użytkownik nie ma zarejestrowanej metody silnego uwierzytelniania. Następnie należy wysłać wiadomość SMS zawierającą jednorazowy kod dostępu, aby użytkownik zweryfikował swój numer telefonu. Gdy użytkownik wprowadzi prawidłowy jednorazowy kod dostępu, zestaw SDK ukończy proces logowania.

Aby zarejestrować metodę silnego uwierzytelniania (jednorazowy kod dostępu sms) dla użytkownika z obsługą uwierzytelniania wieloskładnikowego, należy wykonać następujące czynności:

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

    • Poinformuj użytkownika, że rejestracja metody silnego uwierzytelniania jest wymagana do zalogowania się (opcjonalnie).
    • Zbierz numer telefonu, który ma zostać zarejestrowany jako metoda silnego uwierzytelniania. Użytkownik musi podać numer telefonu, aby został zarejestrowany jako metoda silnego uwierzytelniania.
    • Zbierz jednorazowy kod dostępu sms od użytkownika, aby zrealizować uwierzytelnianie dwuskładnikowe.
    • Wyślij ponownie jednorazowy kod dostępu (zalecane).
  2. Obsługa StrongAuthMethodRegistrationRequired wyniku logowania:

     val parameters = NativeAuthSignInParameters(username = email)
     parameters.password = password 
     val signInResult: SignInResult = authClient.signIn(parameters) 
    
     when (actionResult) {
         // Handle "strong authentication method registration required" result 
         is SignInResult.StrongAuthMethodRegistrationRequired -> {
             val authMethod = actionResult.authMethods.first {it.challengeChannel.uppercase() == "SMS"}
             // Next Step: challengeAuthMethod using nextState
         }
     }
    

    Podczas logowania, jeśli uwierzytelnianie wieloskładnikowe jest konieczne i nie ma zarejestrowanego silnego uwierzytelniania, system zwraca SignInResult.StrongAuthMethodRegistrationRequired, wymagając od użytkownika podania numeru telefonu jako metody silnego uwierzytelniania.

  3. Obsługa wyniku challengeAuthMethod() :

    val registerStrongAuthState = signInResult.nextState
    val verificationContact = "<phone number>" // format should be "<+prefix phone_number>"
    val params = NativeAuthChallengeAuthMethodParameters(authMethod, verififcationContact)
    val challengeAuthResult = registerStrongAuthState.challengeAuthMethod(params)
    
    when (challengeAuthResult) {
        is RegisterStrongAuthChallengeResult.VerificationRequired -> {
            // Next Step: submitChallenge using nextState
        }
        is RegisterStrongAuthChallengeError -> {
            // Handle "register strong auth challenge" error
        }
        else -> {
            // Handle unexpected result
        }
    }
    

    Metoda challengeAuthMethod() wysyła jednorazowy kod dostępu do numeru telefonu określonego w pliku verificationContact. challengeAuthMethod() Zwraca wynik RegisterStrongAuthChallengeResult.VerificationRequired, który wskazuje, że zestaw SDK oczekuje, że aplikacja wyśle jednorazowy kod dostępu SMS wysłany na numer telefonu. Obiekt RegisterStrongAuthChallengeResult.VerificationRequired zawiera nowe odwołanie do stanu, które można pobrać za pomocą challengeAuthResult.nextStatepolecenia . Nowy stan zapewnia dostęp do submitChallenge() metody, której można użyć do wprowadzenia kodu jednorazowego SMS, wysłanego na numer telefonu użytkownika.

  4. Obsługa wyniku submitChallenge() :

    val registerStrongAuthVerificationRequiredState = challengeAuthResult.nextState
    val submitChallengeResult = registerStrongAuthVerificationRequiredState.submitChallenge(smsCode)
    
    when (actionResult) {
        is SignInResult.Complete -> {
            // Handle sign in success      
        }
        is RegisterStrongAuthSubmitChallengeError -> {
            // Handle "register strong auth submit challenge" error
        }
        else -> {
            // Handle unexpected result      
        }
    }
    

    W najbardziej typowym scenariuszu submitChallenge() zwraca wynik SignInResult.Complete, który wskazuje, że użytkownik został pomyślnie uwierzytelniony.

Obsługa błędów rejestracji metody silnego uwierzytelniania

Aby obsłużyć błędy występujące podczas rejestracji metody silnego uwierzytelniania, możesz użyć tych fragmentów kodu:

  1. Obsługa błędów metody challengeAuthMethod()

    val challengeAuthResult = registerStrongAuthState.challengeAuthMethod(params)
    
    if (challengeAuthResult is RegisterStrongAuthChallengeResult.VerificationRequired) {
        // Next Step: submit challenge
    } else if (challengeAuthResult is RegisterStrongAuthChallengeError) {
        // define error from the typed variable
        val error = challengeAuthResult
    
        // Handle errors under RegisterStrongAuthChallengeError
        when {
            error.isInvalidInput() -> {
                // Display error
            }
            error.isAuthMethodBlocked() -> {
                // Authentication method selected has been blocked. Reach out to customer support  to seek assistance.
            }
            else -> {
                // Unexpected error
            }
        }
    }
    

    Element RegisterStrongAuthChallengeError jest obsługiwany po zarejestrowaniu wyzwania przy użyciu metody registerStrongAuthState.challengeAuthMethod(). isInvalidInput() Użyj metody , aby sprawdzić konkretny błąd, na przykład wprowadzony kontakt weryfikacyjny jest nieprawidłowy. W takim przypadku należy użyć poprzedniego odniesienia do stanu, aby wysłać nowe wyzwanie.

  2. Obsługa błędów metody submitChallenge()

    val submitChallengeResult = registerStrongAuthVerificationRequiredState.submitChallenge(challenge = smsCode)
    
    if (submitChallengeResult is SignInResult.Complete) {
        // Handle sign in success
    } else if (submitChallengeResult is RegisterStrongAuthSubmitChallengeError) {
        // Handle errors under RegisterStrongAuthSubmitChallengeError
        when {
            error.isInvalidChallenge() -> {
                // Display error
            }
            else -> {
                // Unexpected error
            }
        }
    }
    

    Element RegisterStrongAuthSubmitChallengeError jest obsługiwany przy użyciu polecenia registerStrongAuthVerificationRequiredState.submitChallenge(challenge = smsCode) po przesłaniu wyzwania. Użyj metody isInvalidChallenge() , aby sprawdzić konkretny błąd, na przykład, gdy przesłane wyzwanie jest nieprawidłowe. W takim przypadku należy użyć odniesienia do poprzedniego stanu, aby ponownie przeprowadzić przesłanie zadania wyzwania.

Następne kroki