Sdílet prostřednictvím


Kurz: Přidání přihlášení do aplikace pro Android pomocí nativního ověřování

Platí pro: Zelený kruh se symbolem bílé značky zaškrtnutí, který označuje následující obsah platí pro externí tenanty. Externí tenanti (další informace)

Tento kurz ukazuje, jak se přihlásit a odhlásit uživatele pomocí jednorázového hesla nebo uživatelského jména nebo uživatelského jména a hesla v mobilní aplikaci pro Android pomocí nativního ověřování.

V tomto kurzu se naučíte:

  • Přihlaste se k uživateli pomocí jednorázového hesla e-mailu nebo uživatelského jména (e-mailu) a hesla.
  • Odhlaste se od uživatele.
  • Zpracování chyby přihlášení

Požadavky

Přihlášení uživatele

Pokud se chcete přihlásit uživatele pomocí jednorázového hesla, shromážděte e-mail a odešlete e-mail obsahující jednorázové heslo, aby uživatel ověřil svůj e-mail. Když uživatel zadá platné jednorázové heslo, aplikace ho přihlásí.

Pokud se chcete přihlásit uživatele pomocí uživatelského jména (e-mailu) a hesla, shromážděte e-mail a heslo od uživatele. Pokud je uživatelské jméno a heslo platné, aplikace se přihlásí uživatele.

Abyste mohli přihlásit uživatele, musíte:

  1. Vytvořte uživatelské rozhraní pro:

    • Získejte e-mail od uživatele. Přidejte do vstupů ověření, abyste měli jistotu, že uživatel zadá platnou e-mailovou adresu.
    • Pokud se přihlásíte pomocí uživatelského jména (e-mailu) a hesla, shromážděte heslo.
    • Pokud se přihlašujete pomocí jednorázového hesla zaslaného na e-mail, shromážděte toto heslo od uživatele.
    • Pokud se přihlašujete pomocí jednorázového hesla zaslaného e-mailem, doporučujeme znovu odeslat jednorázové heslo.
  2. V uživatelském rozhraní přidejte tlačítko, jehož událost výběru spustí přihlášení, jak je znázorněno v následujícím fragmentu kódu:

     CoroutineScope(Dispatchers.Main).launch {
         val parameters = NativeAuthSignInParameters(username = email)
         // Assign 'password' param if you sign in with username (email) and password
         // parameters.password = password
         val actionResult: SignInResult = authClient.signIn(parameters)
    
         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 getAccessTokenParameters = NativeAuthGetAccessTokenParameters()
                 val accessTokenResult = accountState.getAccessToken(getAccessTokenParameters)
    
                 if (accessTokenResult is GetAccessTokenResult.Complete) {
                     val accessToken = accessTokenResult.resultValue.accessToken
                     val idToken = accountState.getIdToken()
                 }
             }
         }
     }
    

    Pokud uživatel nemusí odesílat heslo, například když se uživatel přihlásí pomocí e-mailu a hesla, použijte následující fragment kódu:

    CoroutineScope(Dispatchers.Main).launch {
        val parameters = NativeAuthSignInParameters(username = email)
        parameters.password = password
        val actionResult: SignInResult = authClient.signIn(parameters)
    
        if (actionResult is SignInResult.Complete) -> {
            // Handle sign in success
            val accountState = actionResult.resultValue
    
            val getAccessTokenParameters = NativeAuthGetAccessTokenParameters()
            val accessTokenResult = accountState.getAccessToken(getAccessTokenParameters)
    
            if (accessTokenResult is GetAccessTokenResult.Complete) {
                val accessToken = accessTokenResult.resultValue.accessToken
                val idToken = accountState.getIdToken()
            }
        }
    }
    
    • Pokud chcete spustit tok přihlašování, použijte metodu signIn(parameters) sady SDK.
    • Instance třídy NativeAuthSignInParameters obsahující username, která je e-mailovou adresou, kterou od uživatele shromažďujete.
    • Pokud je přihlašovací metoda uživatelské jméno (e-mail) a heslo, parametr metody password je heslo, které od uživatele shromažďujete.
    • Ve většině běžných scénářů signIn(parameters) vrátí výsledek, SignInResult.CodeRequired, což značí, že SDK očekává, že aplikace odešle e-mailem jednorázový přístupový kód, který byl odeslán na e-mailovou adresu uživatele.
    • Objekt SignInResult.CodeRequired obsahuje nový odkaz na stav, který můžeme načíst prostřednictvím actionResult.nextState.
    • Nový stav nám dává přístup ke dvěma novým metodám:
      • submitCode() odešle jednorázový přístupový kód e-mailu, který aplikace shromažďuje od uživatele.
      • resendCode() znovu odešle e-mail s jednorázovým přístupovým kódem, pokud uživatel kód neobdrží.

Zpracování chyb přihlášení

Během přihlašování nejsou všechny akce úspěšné. Uživatel se například může pokusit přihlásit pomocí e-mailové adresy, která neexistuje, nebo odeslat neplatný kód.

Řešení chyb při zahájení přihlášení

K zpracování chyb v metodě signIn(parameters) použijte následující fragment kódu:

 val parameters = NativeAuthSignInParameters(username = email)
 // Assign 'password' param if you sign in with username (email) and password
 // parameters.password = password
val actionResult: SignInResult = authClient.signIn(parameters)

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 označuje neúspěšný výsledek akce vrácený signIn(parameters), takže výsledek akce neobsahuje odkaz na nový stav.
  • Pokud actionResult is SignUpError, sada Android SDK poskytuje pomocné metody, které vám umožní dále analyzovat konkrétní chyby:
    • Metoda isUserNotFound() zkontroluje, jestli se uživatel přihlásí pomocí uživatelského jména (e-mailové adresy), která neexistuje.
    • Metoda isBrowserRequired() zkontroluje potřebu prohlížeče (záložního webu) k dokončení toku ověřování. K tomuto scénáři dochází v případě, že k dokončení toku ověřování nestačí nativní ověřování. Správce například nakonfiguruje jako metodu ověřování e-mail a heslo, ale aplikace neposílá heslo jako typ výzvy nebo ho jednoduše nepodporuje. Použijte postup uvedený v Podpora webové zálohy v aplikaci pro Android při zpracování scénáře, kdy k tomu dojde.
    • Tato metoda isAuthNotSupported() zkontroluje, jestli aplikace odešle typ výzvy, který Microsoft Entra nepodporuje, jedná se o jinou hodnotu typu výzvy než oob a heslo. Přečtěte si další informace o typech výzvy .
    • U uživatelského jména (e-mailu) a přihlášení pomocí hesla metoda isInvalidCredentials() zkontroluje, jestli je kombinace uživatelského jména a hesla nesprávná.

Řešení chyb odesílání kódu

K zpracování chyb v metodě submitCode() použijte následující fragment kódu:

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
}
  • Chyba SubmitCodeError značí neúspěšný výsledek akce vrácený submitCode(), takže výsledek akce neobsahuje odkaz na nový stav.
  • isInvalidCode() zkontroluje konkrétní chybu. V tomto případě musí být předchozí odkaz na stav použit k opětovnému provedení akce.

K načtení nového jednorázového hesla e-mailu použijte následující fragment kódu:

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

Dokončili jste všechny potřebné kroky k úspěšnému přihlášení uživatele ve vaší aplikaci. Sestavte a spusťte vaši aplikaci. Pokud je všechno v pořádku, měli byste být schopni poskytnout e-mail, přijmout kód e-mailu a použít ho k úspěšnému přihlášení uživatele.

Čtení nároků ID tokenu

Jakmile vaše aplikace získá identifikační token, můžete načíst nároky spojené s aktuálním účtem. K tomu použijte následující fragment kódu.

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

Klíč, který používáte pro přístup k hodnotě deklarace identity, je název, který zadáte při přidání atributu uživatele jako deklaraci tokenu identity.

Chcete-li se naučit, jak přidat předdefinované a vlastní atributy jako deklarace identity tokenů, podívejte se na článek Přidání atributů uživatele do deklarací identity tokenů.

Odhlášení uživatele

Pokud se chcete odhlásit uživatele, musíte účet aktuálně uložený v mezipaměti odebrat.

  1. Vytvořte vlastní uživatelské rozhraní, které zahrnuje:

    • Tlačítko odhlášení, které uživatel vybere a odešle žádost o odhlášení.
  2. Pokud se chcete odhlásit uživatele, použijte následující kód:

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

Zpracování chyb odhlášení

Odhlášení by mělo být bez chyb. Pokud dojde k nějakým chybám, pomocí následujícího fragmentu kódu zkontrolujte výsledek chyby:

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

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

Dokončili jste všechny potřebné kroky k úspěšnému odhlášení uživatele ve vaší aplikaci. Sestavte a spusťte vaši aplikaci. Pokud je všechno v pořádku, měli byste být schopni vybrat tlačítko odhlásit se, abyste se mohli úspěšně odhlásit.

Nakonfigurujte vlastního poskytovatele deklarací

Pokud chcete přidat deklarace identity z externího systému do tokenu vydaného vaší aplikaci, použijte vlastního zprostředkovatele deklarací identity. Vlastní zprostředkovatel nároků se skládá z vlastního rozšíření pro ověřování, které volá externí rozhraní REST API pro načtení nároků z externích systémů.

Postupujte podle kroků v části Konfigurace vlastního poskytovatele deklarací pro přidání deklarací z externího systému do bezpečnostních tokenů.

Povolení přihlášení pomocí aliasu nebo uživatelského jména

Uživatelům, kteří se přihlašují pomocí e-mailové adresy a hesla, můžete také povolit přihlášení pomocí uživatelského jména a hesla. Uživatelské jméno označované také jako alternativní přihlašovací identifikátor může být ID zákazníka, číslo účtu nebo jiný identifikátor, který se rozhodnete použít jako uživatelské jméno.

Uživatelské jména můžete k uživatelskému účtu přiřadit ručně prostřednictvím Centra pro správu Microsoft Entra nebo ho v aplikaci automatizovat prostřednictvím rozhraní Microsoft Graph API.

Pomocí postupu přihlášení pomocí aliasu nebo článku o uživatelském jménu můžete uživatelům povolit přihlášení pomocí uživatelského jména ve vaší aplikaci:

  1. Povolte přihlášení pomocí uživatelského jména.
  2. Vytvořte uživatele s uživatelským jménem v Centru pro správu nebo aktualizujte stávající uživatele přidáním uživatelského jména. Alternativně můžete také automatizovat vytváření a aktualizace uživatelů ve vaší aplikaci pomocí rozhraní Microsoft Graph API.