Exercice - Connecter des utilisateurs avec MSAL

Effectué

Dans cet exercice, vous utilisez la bibliothèque d’authentification Microsoft pour Java (MSAL4J) pour ajouter l’authentification dans un exemple d’application web Java et permettre aux utilisateurs de se connecter avec leur compte Microsoft Entra.

L’exemple d’application que vous utilisez dans cet exercice est une application servlet Java qui permet aux utilisateurs de se connecter et qui affiche le nom d’utilisateur et des informations de base sur le profil. Elle vous permet également d’appeler l’API Microsoft Graph pour afficher des informations utilisateur.

Création d'une application web Java

À partir de votre interpréteur de commandes ou de votre ligne de commande :

  1. Créez un dossier pour l’application.

    mkdir ~/javawebapp
    
  2. Clonez l’exemple d’application à partir du dépôt GitHub dans le nouveau dossier.

    git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
    
  3. Passez au dossier où se trouve l’exemple d’application de cet exercice.

    cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
    

Configurer l’application

Pour configurer le code, ouvrez le projet d’application dans votre IDE préféré (par exemple, IntelliJ ou VS Code).

  1. Ouvrez le fichier ./src/main/resources/authentication.properties.

  2. Dans la propriété aad.authority, recherchez la chaîne {enter-your-tenant-id-here}. Remplacez la valeur existante par la valeur ID d’annuaire (locataire) ; comme indiqué dans l’image suivante ; car l’application a été inscrite avec l’option Comptes dans cet annuaire organisationnel uniquement.

  3. Dans la propriété aad.clientId, recherchez la chaîne {enter-your-client-id-here} et remplacez la valeur existante par la valeur ID d’application (client) ; la valeur clientId ; de l’application inscrite que vous avez copié à partir du portail Azure.

    Capture d’écran mettant en évidence l’identifiant d’une application inscrite auprès de Microsoft Entra ID dans le Portail Azure.

  4. Dans la propriété aad.secret, recherchez la chaîne {enter-your-client-secret-here} et remplacez la valeur existante par la valeur clé que vous avez enregistrée durant la création de l’application dans le portail Azure.

Exécution de l'application

  1. Vérifiez que votre serveur Tomcat est en cours d’exécution et que vous disposez des privilèges nécessaires pour y déployer une application web. Vérifiez que l’adresse de l’hôte du serveur est http://localhost:8080.

  2. Compilez et empaquetez le projet avec Maven :

    cd ~/javawebapp/2-Authorization-I/call-graph
    mvn clean package
    
  3. Recherchez le fichier .war obtenu sur ./target/msal4j-servlet-graph.war. Pour procéder au déploiement sur Tomcat, copiez ce fichier .war dans le répertoire /webapps/ de votre répertoire d’installation de Tomcat et démarrez le serveur Tomcat.

  4. Ouvrez votre navigateur et accédez à http://localhost:8080/msal4j-servlet-graph/. Vous êtes redirigé pour vous connecter avec Microsoft Entra ID. Une fois la connexion réussie, vous devriez voir une page semblable à celle-ci :

    Capture d’écran montrant le nom d’utilisateur dans la page après une connexion réussie à l’exemple d’application.

  5. Sélectionnez le bouton Détails du jeton d’ID pour voir certaines des revendications décodées du jeton d’ID.

Vue d’ensemble du code d’authentification

Vous pouvez trouver la plupart du code d’authentification dans l’exemple d’application sous le répertoire java/com/microsoft/azuresamples/msal4j/ du projet. Il contient plusieurs servlets qui fournissent les points de terminaison d’authentification dans l’application pour la connexion, la déconnexion et la gestion du rappel de redirection à partir de Microsoft Entra ID. Ces servlets utilisent les classes d’assistance dans le répertoire java/com/microsoft/azuresamples/msal4j/helpers/ pour appeler les méthodes d’authentification fournies par MSAL. Un filtre de servlet, défini dans AuthenticationFilter.java, redirige les demandes non authentifiées à des routes protégées vers une page d’erreur HTTP 401 Non autorisé.

Pour ajouter l’authentification à votre application, vous devez inclure les classes de servlet sous les répertoires java/com/microsoft/azuresamples/msal4j/authservlets et java/com/microsoft/azuresamples/msal4j/authwebapp, les classes d’assistance dans le répertoire java/com/microsoft/azuresamples/msal4j/helpers/ et le filtre de servlet d’authentification AuthenticationFilter.java dans vos projets. Voici plus d’informations sur le code d’authentification MSAL.

  1. MSAL4J est disponible sur Maven. Vous devez ajouter MSAL4J en tant que dépendance dans le fichier pom.xml du projet :

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.17.2</version>
    </dependency>
    
  2. La première étape du processus de connexion consiste à envoyer une requête au point de terminaison /authorize du locataire Microsoft Entra. L’instance ConfidentialClientApplication MSAL4J est exploitée pour construire une URL de demande d’autorisation. L’application redirige le navigateur vers cette URL, où l’utilisateur se connecte. Le code suivant est un extrait de l’implémentation de la méthode redirectToAuthorizationEndpoint dans la classe AuthHelper.

    final ConfidentialClientApplication client = getConfidentialClientInstance();
    AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters
                                                        .builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))
                                                        .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();
    contextAdapter.redirectUser(authorizeUrl);
    
    • AuthorizationRequestUrlParameters : les paramètres qui doivent être définis pour générer une AuthorizationRequestUrl.
    • REDIRECT_URI : L’URI de redirection est l’URI auquel le fournisseur d’identité renvoie les jetons de sécurité. Microsoft Entra ID redirige le navigateur ; ainsi que le code d’authentification ; vers cet URI après la collecte des informations d’identification de l’utilisateur. Il doit correspondre à l’URI de redirection dans l’inscription de l’application Microsoft Entra.
    • SCOPES : Les étendues sont des autorisations demandées par l’application. Normalement, les trois étendues openid profile offline_access suffisent pour recevoir en réponse un jeton d’ID pour une connexion utilisateur. Elles sont définies par défaut par MSAL.
  3. L’utilisateur reçoit une invite de connexion de Microsoft Entra ID. Si la tentative de connexion réussit, le navigateur de l’utilisateur est redirigé vers le point de terminaison de redirection de l’application avec un code d’autorisation valide dans le point de terminaison. L’instance ConfidentialClientApplication échange ensuite ce code d’autorisation contre un jeton d’identifiant et un jeton d’accès de Microsoft Entra ID. Le code suivant est un extrait de l’implémentation de la méthode processAADCallback dans la classe AuthHelper.

    // First, validate the state, then parse any error codes in response, then extract the authCode. Then:
    // build the auth code params:
    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                                                        .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();
    
    // Get a client instance and leverage it to acquire the token:
    final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
    final IAuthenticationResult result = client.acquireToken(authParams).get();
    
    • AuthorizationCodeParameters : paramètres qui doivent être définis pour échanger le code d’autorisation contre un ID et/ou un jeton d’accès.
    • authCode : code d’autorisation reçu au niveau du point de terminaison de redirection.
    • REDIRECT_URI : l’URI de redirection utilisé à l’étape précédente doit être repassé.
    • SCOPES : les étendues utilisées à l’étape précédente doivent être repassées.
  4. Si acquireToken réussit, les revendications du jeton sont extraites. Si le contrôle nonce réussit, les résultats sont placés dans context (instance de IdentityContextData ) et enregistrés dans la session. L’application peut ensuite instancier cela à partir de la session ; au moyen d’une instance de IdentityContextAdapterServlet ; chaque fois qu’elle a besoin d’y accéder :

    // parse IdToken claims from the IAuthenticationResult:
    // (the next step - validateNonce - requires parsed claims)
    context.setIdTokenClaims(result.idToken());
    
    // if nonce is invalid, stop immediately! this could be a token replay!
    // if validation fails, throws exception and cancels auth:
    validateNonce(context);
    
    // set user to authenticated:
    context.setAuthResult(result, client.tokenCache().serialize());