Kurz: Přihlášení uživatelů v mobilní aplikaci Android (Kotlin)
Toto je třetí kurz série kurzů, který vás provede přihlašováním uživatelů pomocí Microsoft Entra Externí ID.
V tomto kurzu:
- Přihlášení uživatele
- Odhlásit uživatele
Požadavky
Kurz: Příprava aplikace pro Android na ověřování
Přihlášení uživatele
Máte dvě hlavní možnosti pro přihlašování uživatelů pomocí knihovny MICROSOFT Authentication Library (MSAL) pro Android: interaktivní nebo tiché získání tokenů.
Pokud se chcete přihlásit uživatele interaktivně, použijte následující kód:
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) }
Kód zahájí proces získání tokenu interaktivně pomocí knihovny MSAL pro Android. Nejprve vymaže pole textového protokolu. Pak zkontroluje, jestli už existuje přihlášený účet, pokud ano, zobrazí se zpráva informační zprávy s informací, že účet je již přihlášený a vrací se.
Dále extrahuje obory z textového vstupu a před jejich rozdělením na pole je převede na malá písmena. Pomocí těchto oborů sestaví parametry pro získání tokenu, včetně spuštění procesu autorizace z aktuální aktivity a zadání zpětného volání. Nakonec zavolá
acquireToken()
ověřovacího klienta s vytvořenými parametry, aby zahájil proces získání tokenu.V kódu, kde zadáme zpětné volání, použijeme funkci s názvem
getAuthInteractiveCallback()
. Funkce by měla mít následující kód: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 kódu definuje funkci,
getAuthInteractiveCallback
která vrací instanciAuthenticationCallback
. V rámci této funkce je vytvořena anonymní třída implementovanáAuthenticationCallback
rozhraní.Pokud ověřování proběhne úspěšně (
onSuccess
), zaznamená úspěšné ověření, načte token ID a deklarace identity, aktualizuje přístupový token asynchronně pomocíCoroutineScope
a aktualizuje uživatelské rozhraní pomocí nového přístupového tokenu. Kód načte token ID a zaprokoluje hoauthenticationResult
. Deklarace identity v tokenu obsahují informace o uživateli, například jméno, e-mail nebo jiné informace o profilu. Deklarace identity přidružené k aktuálnímu účtu můžete načíst pomocíauthenticationResult.account.claims
přístupu .Pokud dojde k chybě ověřování (
onError
), zaprokoluje chybu, vymaže přístupový token, aktualizuje uživatelské rozhraní chybovou zprávou a poskytuje konkrétnější zpracováníMsalClientException
aMsalServiceException
. Pokud uživatel zruší ověřování (onCancel
), zaproprokoluje zrušení.Nezapomeňte zahrnout příkazy importu. Android Studio by měl automaticky obsahovat příkazy pro import.
Pokud chcete uživatele přihlásit bezobslužně, použijte následující kód:
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) }
Kód zahájí proces získání tokenu bezobslužně. Nejdřív vymaže textový protokol. Pak zkontroluje, jestli je k dispozici účet; Pokud ne, zobrazí se zpráva informační zprávy, která to znamená, a ukončí se. Dále extrahuje obory z textového vstupu, převede je na malá písmena a rozdělí je na pole.
Pomocí těchto oborů vytvoří parametry pro získání tokenu bezobslužně, určení účtu, autority, oborů a zpětného volání. Nakonec se asynchronně aktivuje
acquireTokenSilentAsync()
u ověřovacího klienta s vytvořenými parametry a spustí proces získání tichého tokenu.V kódu, kde zadáme zpětné volání, použijeme funkci s názvem
getAuthSilentCallback()
. Funkce by měla mít následující kód: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 */ } } } } }
Kód definuje zpětné volání pro tiché ověřování. Implementuje
SilentAuthenticationCallback
rozhraní a přepisuje dvě metody.onSuccess
V metodě protokoluje úspěšné ověření a zobrazí přístupový token.onError
V metodě protokoluje selhání ověřování, zpracovává různé typy výjimek, napříkladMsalClientException
aMsalServiceException
, a navrhuje opakování s interaktivním ověřováním v případě potřeby.Nezapomeňte zahrnout příkazy importu. Android Studio by měl automaticky obsahovat příkazy pro import.
Odhlásit se
Pokud chcete odhlásit uživatele z aplikace Android (Kotlin) pomocí KNIHOVNY MSAL pro Android, použijte následující kód:
private fun removeAccount() {
binding.userName.text = ""
binding.txtLog.text = ""
authClient.signOut(signOutCallback())
}
Kód odebere účet z aplikace. Vymaže zobrazené uživatelské jméno a textový protokol. Potom aktivuje proces odhlášení pomocí ověřovacího klienta a určí zpětné volání odhlášení, které zpracuje dokončení operace odhlášení.
V kódu, kde zadáme zpětné volání, použijeme funkci s názvem signOutCallback()
. Funkce by měla mít následující kód:
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
}
}
}
Kód definuje zpětné volání odhlášení pro jeden účet ve veřejné klientské aplikaci. Implementuje ISingleAccountPublicClientApplication.SignOutCallback
rozhraní a přepisuje dvě metody.
onSignOut
V metodě nullifuje aktuální účet a odpovídajícím způsobem aktualizuje uživatelské rozhraní. onError
V metodě zaznamená všechny chyby, ke kterým dojde během procesu odhlášení, a aktualizuje textový protokol s odpovídající zprávou o výjimce.
Nezapomeňte zahrnout příkazy importu. Android Studio by měl automaticky obsahovat příkazy pro import.
Další kroky
Kurz: Volání chráněného webového rozhraní API v aplikaci Android (Kotlin).