Exercice - Connecter des utilisateurs avec MSAL
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 :
Créez un dossier pour l’application.
mkdir ~/javawebapp
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
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).
Ouvrez le fichier ./src/main/resources/authentication.properties.
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.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 valeurclientId
; de l’application inscrite que vous avez copié à partir du portail Azure.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
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
.Compilez et empaquetez le projet avec Maven :
cd ~/javawebapp/2-Authorization-I/call-graph mvn clean package
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.
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 :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.
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>
La première étape du processus de connexion consiste à envoyer une requête au point de terminaison
/authorize
du locataire Microsoft Entra. L’instanceConfidentialClientApplication
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éthoderedirectToAuthorizationEndpoint
dans la classeAuthHelper
.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 uneAuthorizationRequestUrl
.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 étenduesopenid 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.
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éthodeprocessAADCallback
dans la classeAuthHelper
.// 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.
Si
acquireToken
réussit, les revendications du jeton sont extraites. Si le contrôle nonce réussit, les résultats sont placés danscontext
(instance deIdentityContextData
) et enregistrés dans la session. L’application peut ensuite instancier cela à partir de la session ; au moyen d’une instance deIdentityContextAdapterServlet
; 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());