Suivre le processus de connexion d’une application web Java
Ce didacticiel suit une requête de connexion à l’aide d’un exemple de code de servlet Java. Il explique comment le navigateur, Microsoft Entra ID, MSAL4J et les helpers de session de l'application interagissent.
Note
Ces fragments ne sont pas une application complète ni une implémentation prête pour la production. Ils omettent le code servlet environnant, les importations, la configuration et la gestion des erreurs pour se concentrer sur le flux. Aucune application ne doit être générée ou exécutée pour terminer cette unité.
Identifier les helpers définis par l’application
MSAL4J fournit les API d’acquisition de jetons. L’application fournit le code environnant qui coordonne les redirections du navigateur, le traitement de rappel et les sessions. Les fragments utilisent ces aides illustratives :
| Aide | Rôle dans les exemples |
|---|---|
Config |
Fournit les paramètres de l’application.
REDIRECT_URIreprésente l’URI de rappel inscrit et SCOPES contient l’étendue User.Read de Microsoft Graph unique. |
getConfidentialClientInstance et AuthHelper.getConfidentialClientInstance |
Renvoyer un ConfidentialClientApplication configuré. |
contextAdapter |
Connecte la requête HTTP et la réponse au contexte de session de l’application. Sa redirectUser méthode redirige le navigateur. |
IdentityContextData et context |
Conservez les données associées à une demande de connexion et à une session, notamment la nonce, les revendications de jeton, le résultat d’authentification et le cache de jeton sérialisé. |
Ces noms et leurs méthodes utilitaires sont définis par l’application ; il ne s’agit pas d’API MSAL4J. Leurs rôles sont expliqués dans la procédure pas à pas, mais leurs implémentations ne sont pas incluses.
Une URL d’autorisation démarre l’interaction du navigateur
Le premier fragment montre comment l’application crée une URL d’autorisation et redirige le navigateur. L’utilitaire fournit un client confidentiel configuré. L’application a également généré de nouvelles valeurs nonce et state, imprévisibles, pour cette requête de connexion et les a conservées pour les comparer ultérieurement.
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 décrit l’URI de rappel, l’étendue demandée et les options de protocole.
Collections.singleton est approprié ici, car Config.SCOPES contient une seule étendue, plutôt qu’une liste séparée par un espace de plusieurs étendues. MSAL ajoute par défaut les étendues standard OpenID Connect openid, profile et offline_access.
Avec MSAL4J 1.9.1, ResponseMode.QUERY place les paramètres de réponse d’autorisation dans la chaîne de requête du rappel.
Prompt.SELECT_ACCOUNT demande de sélectionner un compte.
state permet de mettre en corrélation la réponse avec la demande de connexion, tout en nonce liant le jeton d’ID à cette demande.
Note
À compter de MSAL4J 1.24.0, ResponseMode.QUERY est déconseillé. Lorsqu’elle a passé cette valeur, AuthorizationRequestUrlParameters.Builder.responseMode remplace ResponseMode.FORM_POST et enregistre un avertissement. Il s’agit d’un changement de comportement de bibliothèque ; Microsoft Entra prend toujours en charge les réponses du code d’autorisation en mode requête au niveau du protocole.
Pour les réponses POST du formulaire, un rappel de servlet doit pouvoir prendre en charge les requêtes POST, par exemple via doPost, au lieu de s’appuyer uniquement sur doGet. Le traitement du rappel doit encore conserver la session associée, state ainsi que la validation nonce et la gestion des erreurs. Le simple fait de modifier uniquement l’énumération « response-mode » ne permet pas de prendre en charge ces responsabilités.
getAuthorizationRequestUrl construit l’URL ; redirectUser est l’assistance définie par l’application qui redirige le navigateur. Aucune opération n’échange un code d’autorisation.
Important
La requête illustrée inclut Microsoft Graph User.Read délégué lors de la connexion. Une invite de consentement s’affiche uniquement lorsque le consentement est nécessaire et que la stratégie de locataire permet à l’utilisateur de l’accorder ; le consentement préalable de l’utilisateur ou de l’administrateur peut signifier qu’aucune invite n’apparaît. Le message Approbation de l’administrateur requise indique qu’un administrateur autorisé doit examiner la demande selon le processus approuvé par l’organisation. La réponse appropriée n’est pas d’affaiblir la stratégie de consentement à l’échelle du tenant. Consultez le consentement de l’utilisateur et de l’administrateur.
La fonction de rappel échange un code contre des jetons
Après une réponse d'autorisation réussie, Microsoft Entra ID redirige le navigateur vers l'URI de rappel de l'application avec un code d'autorisation. Le fragment suivant porte sur l’échange, une fois que le rappel a validé state, géré les réponses d’erreur et extrait authCode. Il n’affiche pas l’intégralité de l’implémentation de la fonction de rappel.
final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
.builder(authCode, new URI(Config.REDIRECT_URI))
.scopes(Collections.singleton(Config.SCOPES))
.build();
final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
final IAuthenticationResult result = client.acquireToken(authParams).get();
AuthorizationCodeParameters connecte le code reçu à l’URI de rappel et à l’étendue demandée. L’URI de redirection doit correspondre à celui utilisé dans la demande d’autorisation et l’inscription de l’application. Le client confidentiel authentifie l’application lors de l’échange du code au niveau du point de terminaison du jeton.
acquireToken renvoie un future, et .get() attend son résultat dans cet exemple. Une rédemption réussie produit un IAuthenticationResult ; un échange ayant échoué doit être traité comme une erreur. Les codes d’autorisation sont de courte durée et d’utilisation unique, et non réutilisables pour les appels d’API ultérieurs.
Note
Pour les nouvelles implémentations, suivez les instructions de flux de code d’autorisation actuelles : Microsoft recommande la clé de preuve pour le code Exchange (PKCE) pour tous les types d’applications, y compris les applications web confidentielles. PKCE est requis pour les applications à page unique (SPA), mais ne constitue pas une exigence imposée par la plateforme pour l’application web confidentielle illustrée ici.
Les API de construction d’URL et d’échange de code MSAL4J explicites indiquées ici ne génèrent pas automatiquement les entrées PKCE. Générez un vérificateur nouveau et imprévisible pour chaque demande de connexion et conservez-le en toute sécurité pour le rappel correspondant. Sur le générateur de requête d’autorisation, fournissez le défi dérivé de S256 comme codeChallenge et définissez codeChallengeMethod("S256") ; sur le générateur d’échange, fournissez le codeVerifier correspondant. PKCE ne remplace pas l’authentification du client ni la validation state et nonce. Les fragments ci-dessus omettent ces entrées PKCE.
L’application associe le résultat à une session
Le fragment suivant illustre la limite entre la réception de jetons et le traitement d’une session comme authentifiée. Ici, context est une instance IdentityContextData définie par l’application.
context.setIdTokenClaims(result.idToken());
validateNonce(context);
context.setAuthResult(result, client.tokenCache().serialize());
Le premier appel rend les déclarations du jeton d’identité disponibles pour la validation du nonce de l’application. La fonction utilitaire validateNonce, définie par l’application, compare la valeur nonce renvoyée à la valeur conservée pour la requête d’origine et interrompt le traitement en cas d’échec de la validation. L’appel final enregistre le résultat d’authentification et le cache de jeton sérialisé dans le contexte de l’application, que le code environnant associe à la session.
Ces assistances ne remplacent pas les responsabilités de sécurité plus larges de l’application. Une implémentation complète nécessite également un traitement de réponse correct, un stockage de session sécurisé et de cache de jetons, une gestion des erreurs appropriée et une autorisation pour les opérations protégées.
Connectez le flux
Le navigateur guide l’utilisateur tout au long du processus de connexion et renvoie un code d’autorisation. Le serveur échange ce code avec MSAL4J, traite le résultat et gère la session de l’application. Par la suite, les appels Microsoft Graph utilisent un jeton d’accès, et non le code d’autorisation ou le jeton d’ID.
Pour plus d’informations sur les API de bibliothèque, consultez le générateur d’URL de code d’autorisation MSAL4J et acquérir des jetons avec des codes d’autorisation.