Exceptions dans MSAL Java

Lors du traitement des exceptions, vous pouvez utiliser le type d’exception lui-même et le membre ErrorCode pour distinguer les exceptions. Il existe trois types d’exceptions : MsalClientException, MsalServiceExceptionet MsalInteractionRequiredException, tous qui héritent de MsalException.

  • MsalClientException est levée lorsqu’une erreur se produit localement dans la bibliothèque ou l’appareil.
  • MsalServiceException est levée lorsque le service STS retourne une réponse d’erreur ou une autre erreur réseau se produit.
  • MsalInteractionRequiredException est levée lorsque l’interaction de l’interface utilisateur est requise pour que l’authentification réussisse.

MsalServiceException

MsalServiceException expose les en-têtes HTTP renvoyés lors des requêtes adressées au STS. Vous pouvez y accéder par MsalServiceException.headers()

MsalInteractionRequiredException

L’un des codes d’état courants retournés par MSAL4J lors de l’appel AcquireTokenSilently() est InvalidGrantError. Ce code d’état signifie que l’application doit appeler à nouveau la bibliothèque d’authentification, mais en mode interactif (utilisation d’AuthorizationCodeParameters ou DeviceCodeParameters pour les applications clientes publiques). Cela est dû au fait que d’autres interactions utilisateur sont requises avant qu’un jeton d’authentification puisse être émis.

La plupart du temps où AcquireTokenSilent échoue, c’est parce que le cache de jetons n’a pas de jetons correspondant à votre requête. Les jetons d’accès expirent en 1 heure, et AcquireTokenSilently essaie d’extraire un nouveau jeton en fonction d’un jeton d’actualisation (en termes OAuth2, il s’agit du flux « Jeton d’actualisation »). Ce flux peut également échouer pour différentes raisons, par exemple si un administrateur client configure des stratégies de connexion plus strictes.

L’interaction vise à ce que l’utilisateur effectue une action. Certaines de ces conditions sont faciles à résoudre pour les utilisateurs (par exemple, accepter les conditions d’utilisation en un seul clic) et certaines ne peuvent pas être résolues avec la configuration actuelle (par exemple, l’ordinateur en question doit se connecter à un réseau d’entreprise spécifique).

MSAL expose un reason champ, que vous pouvez lire pour offrir une meilleure expérience utilisateur, par exemple pour indiquer à l’utilisateur que son mot de passe a expiré ou qu’il devra fournir le consentement pour utiliser certaines ressources. Les valeurs prises en charge font partie de l’énumération InteractionRequiredExceptionReason :

Reason Sens Gestion recommandée
BasicAction La condition peut être résolue par interaction utilisateur pendant le flux d’authentification interactif Appeler acquireToken avec des paramètres interactifs
Action supplémentaire La condition peut être résolue par une interaction corrective supplémentaire avec le système, en dehors du flux d’authentification interactif. Appelez acquireToken avec des paramètres interactifs pour afficher un message qui explique l’action corrective. L’application appelante peut choisir de masquer les flux qui nécessitent une action supplémentaire si l’utilisateur est peu susceptible de mener l’action corrective à bien.
MessageOnly La condition ne peut pas être résolue pour l’instant. Le lancement d’un flux d’authentification interactif affiche un message expliquant la condition. Appelez acquireToken avec des paramètres interactifs pour afficher un message qui explique la condition. acquireTokenCall retourne l’erreur UserCanceled une fois que l’utilisateur lit le message et ferme la fenêtre. L’application appelante peut choisir de masquer les flux qui entraînent message_only si l’utilisateur ne peut pas tirer parti du message.
Consentement requis Le consentement de l’utilisateur est manquant ou a été révoqué. Appelez toutes les méthodes acquireToken avec des paramètres interactifs afin que l'utilisateur puisse accorder son consentement.
Le mot de passe de l’utilisateur a expiré Le mot de passe de l’utilisateur a expiré. Appeler acquireToken avec un paramètre interactif afin que l’utilisateur puisse réinitialiser le mot de passe
Consentement requis Le consentement de l’utilisateur est manquant ou a été révoqué Appeler acquireToken avec des paramètres interactifs afin que l’utilisateur puisse réinitialiser le mot de passe
None Aucun détail supplémentaire n’est fourni. La condition peut être résolue par l’interaction de l’utilisateur pendant le flux d’authentification interactif. Appeler acquireToken avec des paramètres interactifs

Exemple de code

IAuthenticationResult result;
try {
    PublicClientApplication application = PublicClientApplication
            .builder("clientId")
            .b2cAuthority("authority")
            .build();

    SilentParameters parameters = SilentParameters
            .builder(Collections.singleton("scope"))
            .build();

    result = application.acquireTokenSilently(parameters).join();
}
catch (Exception ex){
    if(ex instanceof MsalInteractionRequiredException){
        // AcquireToken by either AuthorizationCodeParameters or DeviceCodeParameters
    } else{
        // Log and handle exception accordingly
    }
}