Tutorial: Anmelden von Benutzern bei der mobilen Android-App (Kotlin)
Dies ist das dritte Tutorial in der Tutorialreihe, das Sie durch die Anmeldung von Benutzer mithilfe von Microsoft Entra External ID führt.
In diesem Tutorial gehen Sie wie folgt vor:
- Anmeldung für Benutzer
- Abmelden des Benutzers
Voraussetzungen
Tutorial: Vorbereiten Ihrer Android-App (Kotlin) für die Authentifizierung
Anmeldung für Benutzer
Sie haben zwei Hauptoptionen zum Anmelden von Benutzern mithilfe der Microsoft-Authentifizierungsbibliothek (Microsoft Authentication Library, MSAL) für Android: interaktives oder automatisches Abrufen von Token.
Verwenden Sie den folgenden Code, um Benutzer interaktiv anzumelden:
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) }
Der Code initiiert den Prozess zum interaktiven Abrufen eines Tokens mithilfe der MSAL für Android. Zunächst wird das Textprotokollfeld gelöscht. Anschließend wird überprüft, ob bereits ein angemeldetes Konto vorhanden ist. Falls ja, wird eine Popupmeldung mit dem Hinweis angezeigt, dass bereits ein Konto angemeldet ist, und der Vorgang ist abgeschlossen.
Als Nächstes werden Bereiche aus der Texteingabe extrahiert und in Kleinbuchstaben konvertiert, bevor sie in ein Array aufgeteilt werden. Mithilfe dieser Bereiche werden Parameter zum Abrufen eines Tokens erstellt, einschließlich des Startens des Autorisierungsprozesses über die aktuelle Aktivität und Angeben eines Rückrufs. Schließlich wird
acquireToken()
auf dem Authentifizierungsclient mit den erstellten Parametern aufgerufen, um den Tokenabrufprozess zu initiieren.Im Code, in dem wir den Rückruf angeben, verwenden wir eine Funktion namens
getAuthInteractiveCallback()
. Die Funktion sollte den folgenden Code enthalten: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."); } } }
Der Codeschnipsel definiert die Funktion
getAuthInteractiveCallback
, die eine Instanz vonAuthenticationCallback
zurückgibt. Innerhalb dieser Funktion wird eine anonyme Klasse erstellt, die dieAuthenticationCallback
-Schnittstelle implementiert.Wenn die Authentifizierung erfolgreich ist (
onSuccess
), protokolliert sie die erfolgreiche Authentifizierung, ruft das ID-Token und Ansprüche ab, aktualisiert das Zugriffstoken asynchron mithilfe vonCoroutineScope
und aktualisiert die Benutzeroberfläche mit dem neuen Zugriffstoken. Der Code ruft das ID-Token ausauthenticationResult
ab und protokolliert es. Ansprüche im Token enthalten Informationen zum Benutzer, z. B. Name, E-Mail-Adresse oder andere Profilinformationen. Sie können die dem aktuellen Konto zugeordneten Ansprüche abrufen, indem Sie aufauthenticationResult.account.claims
zugreifen.Wenn ein Authentifizierungsfehler (
onError
) auftritt, wird der Fehler protokolliert, das Zugriffstoken gelöscht, die Benutzeroberfläche mit der Fehlermeldung aktualisiert und eine speziellere Behandlung fürMsalClientException
undMsalServiceException
bereitgestellt. Wenn der Benutzer die Authentifizierung abbricht (onCancel
), wird der Abbruch protokolliert.Stellen Sie sicher, dass Sie die Importanweisungen hinzufügen. Android Studio sollte die Importanweisungen automatisch enthalten.
Verwenden Sie den folgenden Code, um Benutzer automatisch anzumelden:
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) }
Der Code initiiert den Vorgang zum automatischen Abrufen eines Tokens. Zunächst wird das Textprotokoll gelöscht. Anschließend wird überprüft, ob ein verfügbares Konto vorhanden ist. Falls nicht, wird eine Popupmeldung mit einem entsprechenden Hinweis angezeigt, und der Vorgang wird beendet. Als Nächstes werden Bereiche aus der Texteingabe extrahiert, in Kleinbuchstaben konvertiert und in ein Array aufgeteilt.
Mithilfe dieser Bereiche werden Parameter für den automatischen Abruf eines Tokens erstellt. Dabei werden das Konto, die Autorität, die Bereiche und der Rückruf angegeben. Schließlich wird
acquireTokenSilentAsync()
auf dem Authentifizierungsclient mit den erstellten Parametern asynchron ausgelöst und der Prozess für den automatischen Tokenabruf initiiert.Im Code, in dem wir den Rückruf angeben, verwenden wir eine Funktion namens
getAuthSilentCallback()
. Die Funktion sollte den folgenden Code enthalten: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 */ } } } } }
Der Code definiert einen Rückruf für die automatische Authentifizierung. Er implementiert die
SilentAuthenticationCallback
-Schnittstelle, wodurch zwei Methoden außer Kraft gesetzt werden. In deronSuccess
-Methode wird die erfolgreiche Authentifizierung protokolliert, und Zugriffstoken werden angezeigt.In der
onError
-Methode protokolliert der Code einen Authentifizierungsfehler, behandelt unterschiedliche Arten von Ausnahmen (z. B.MsalClientException
undMsalServiceException
) und schlägt vor, den Vorgang bei Bedarf erneut mit interaktiver Authentifizierung zu wiederholen.Stellen Sie sicher, dass Sie die Importanweisungen hinzufügen. Android Studio sollte die Importanweisungen automatisch enthalten.
Abmelden
Wenn Sie einen Benutzer von Ihrer Android-App (Kotlin) mithilfe der MSAL für Android abmelden möchten, verwenden Sie den folgenden Code:
private fun removeAccount() {
binding.userName.text = ""
binding.txtLog.text = ""
authClient.signOut(signOutCallback())
}
Der Code entfernt ein Konto aus der Anwendung. Er löscht den angezeigten Benutzernamen und das Textprotokoll. Anschließend löst er den Abmeldevorgang mithilfe des Authentifizierungsclients aus und gibt einen Abmelderückruf an, um den Abschluss des Abmeldevorgangs zu verarbeiten.
Im Code, in dem wir den Rückruf angeben, verwenden wir eine Funktion namens signOutCallback()
. Die Funktion sollte den folgenden Code enthalten:
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
}
}
}
Der Code definiert einen Abmelderückruf für ein einzelnes Konto in der öffentlichen Clientanwendung. Er implementiert die ISingleAccountPublicClientApplication.SignOutCallback
-Schnittstelle, wodurch zwei Methoden außer Kraft gesetzt werden.
In der onSignOut
-Methode wird das aktuelle Konto aufgehoben und die Benutzeroberfläche entsprechend aktualisiert. In der onError
-Methode werden alle Fehler protokolliert, die während des Abmeldevorgangs auftreten, und das Textprotokoll wird mit der entsprechenden Ausnahmemeldung aktualisiert.
Stellen Sie sicher, dass Sie die Importanweisungen hinzufügen. Android Studio sollte die Importanweisungen automatisch enthalten.
Nächste Schritte
Tutorial: Aufrufen einer geschützten Web-API in der Android-App (Kotlin)