Partager via


Tutoriel : Connecter des utilisateurs dans l’application mobile Android (Kotlin)

Il s’agit du troisième tutoriel de la série de tutoriels qui vous guide sur la connexion des utilisateurs à l’aide de l’ID externe Microsoft Entra.

Dans ce didacticiel, vous allez :

  • Connecter un utilisateur
  • Déconnecter l’utilisateur

Prérequis

Tutoriel : Préparer votre application Android pour l’authentification.

Connecter un utilisateur

Vous avez deux options principales pour connecter des utilisateurs à l’aide de la bibliothèque d’authentification Microsoft (MSAL) pour Android : acquisition de jetons de manière interactive ou silencieuse.

  1. Pour vous connecter de manière interactive à l’utilisateur, utilisez le code suivant :

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

    Le code lance le processus d’acquisition d’un jeton de manière interactive à l’aide de MSAL pour Android. Il efface d’abord le champ du journal de texte. Ensuite, il vérifie s’il existe déjà un compte connecté, le cas échéant, il affiche un message toast indiquant qu’un compte est déjà connecté et retourne.

    Ensuite, il extrait les étendues de l’entrée de texte et les convertit en minuscules avant de les fractionner en tableau. À l’aide de ces étendues, il génère des paramètres pour l’acquisition d’un jeton, notamment le démarrage du processus d’autorisation à partir de l’activité actuelle et la spécification d’un rappel. Enfin, il appelle acquireToken() sur le client d’authentification avec les paramètres construits pour lancer le processus d’acquisition de jetons.

    Dans le code, où nous spécifions notre rappel, nous utilisons une fonction appelée getAuthInteractiveCallback(). La fonction doit avoir le code suivant :

    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.");
            }
        }
    }
    

    L’extrait de code définit une fonction, getAuthInteractiveCallback, qui retourne une instance de AuthenticationCallback. Dans cette fonction, une classe anonyme implémentant l’interface AuthenticationCallback est créée.

    Lorsque l’authentification réussit (onSuccess), elle enregistre l’authentification réussie, récupère le jeton d’ID et les revendications, met à jour le jeton d’accès de manière asynchrone à l’aide CoroutineScopede l’interface utilisateur et met à jour l’interface utilisateur avec le nouveau jeton d’accès. Le code récupère le jeton d’ID du authenticationResult et le journalise. Les revendications du jeton contiennent des informations sur l’utilisateur, telles que son nom, son e-mail ou d’autres informations de profil. Vous pouvez récupérer les revendications associées au compte actuel en accédant à authenticationResult.account.claims.

    S’il existe une erreur d’authentification (onError), elle enregistre l’erreur, efface le jeton d’accès, met à jour l’interface utilisateur avec le message d’erreur et fournit une gestion plus spécifique pour MsalClientException et MsalServiceException. Si l’utilisateur annule l’authentification (onCancel), il enregistre l’annulation.

    Veillez à inclure les instructions import. Android Studio doit inclure automatiquement les instructions import.

  2. Pour connecter l’utilisateur en mode silencieux, utilisez le code suivant :

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

    Le code lance le processus d’acquisition d’un jeton en mode silencieux. Il efface d’abord le journal de texte. Ensuite, il vérifie s’il existe un compte disponible ; si ce n’est pas le cas, il affiche un message toast indiquant cela et se ferme. Ensuite, il extrait les étendues de l’entrée de texte, les convertit en minuscules et les fractionne en tableau.

    À l’aide de ces étendues, elle construit des paramètres pour acquérir un jeton en mode silencieux, en spécifiant le compte, l’autorité, les étendues et le rappel. Enfin, il déclenche de façon asynchrone acquireTokenSilentAsync() sur le client d’authentification avec les paramètres construits, en démarrant le processus d’acquisition de jeton silencieux.

    Dans le code, où nous spécifions notre rappel, nous utilisons une fonction appelée getAuthSilentCallback(). La fonction doit avoir le code suivant :

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

    Le code définit un rappel pour l’authentification silencieuse. Il implémente l’interface SilentAuthenticationCallback en remplaçant deux méthodes. Dans la méthode onSuccess, elle enregistre l’authentification réussie et affiche le jeton d’accès.

    Dans la méthode, cela journalise l’échec de l’authentification onError, gère différents types d’exceptions, tels que MsalClientException et MsalServiceException, et suggère une nouvelle tentative avec l’authentification interactive si nécessaire.

    Veillez à inclure les instructions import. Android Studio doit inclure automatiquement les instructions import.

Se déconnecter

Pour déconnecter un utilisateur de votre application Android (Kotlin) à l’aide de MSAL pour Android, utilisez le code suivant :

private fun removeAccount() {
    binding.userName.text = ""
    binding.txtLog.text = ""

    authClient.signOut(signOutCallback())
}

Le code supprime un compte de l’application. Il efface le nom d’utilisateur et le journal texte affichés. Ensuite, il déclenche le processus de déconnexion à l’aide du client d’authentification, en spécifiant un rappel de déconnexion pour gérer l’achèvement de l’opération de déconnexion.

Dans le code, où nous spécifions notre rappel, nous utilisons une fonction appelée signOutCallback(). La fonction doit avoir le code suivant :

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

Le code définit un rappel de déconnexion pour un compte unique dans l’application cliente publique. Il implémente l’interface ISingleAccountPublicClientApplication.SignOutCallback en remplaçant deux méthodes.

Dans la méthode onSignOut, elle rend nul le compte actuel et met à jour l’interface utilisateur en conséquence. Dans la méthode onError, elle enregistre toutes les erreurs qui se produisent pendant le processus de déconnexion et met à jour le journal texte avec le message d’exception correspondant.

Veillez à inclure les instructions import. Android Studio doit inclure automatiquement les instructions import.

Étapes suivantes

Tutoriel : Appeler une API web protégée dans l’application Android (Kotlin).