Undantag i MSAL-Java

När du bearbetar undantag kan du använda själva undantagstypen och ErrorCode-medlemmen för att skilja mellan undantag. Det finns tre typer av undantag: MsalClientException, MsalServiceExceptionoch MsalInteractionRequiredException, som alla ärver från MsalException.

  • MsalClientException utlöses när ett fel inträffar som är lokalt för biblioteket eller enheten.
  • MsalServiceException utlöses när STS-tjänsten returnerar ett felsvar eller ett annat nätverksfel inträffar.
  • MsalInteractionRequiredException genereras när interaktion med användargränssnittet krävs för att autentiseringen ska lyckas.

MsalServiceException

MsalServiceException exponerar HTTP-huvuden som returneras av begäranden till STS. Du kan komma åt dem genom att MsalServiceException.headers()

MsalInteractionRequiredException

En av de vanliga statuskoderna som returneras från MSAL4J när AcquireTokenSilently() anropas är InvalidGrantError. Den här statuskoden innebär att programmet ska anropa autentiseringsbiblioteket igen, men i interaktivt läge (använda AuthorizationCodeParameters eller DeviceCodeParameters för offentliga klientprogram). Detta beror på att ytterligare användarinteraktion krävs innan en autentiseringstoken kan utfärdas.

För det mesta när AcquireTokenSilently misslyckas beror det på att tokencachen inte har token som matchar din begäran. Åtkomsttoken upphör att gälla om en timme och AcquireTokenSilently försöker hämta en ny baserat på en uppdateringstoken (i OAuth2-termer är detta flödet "Uppdatera token"). Det här flödet kan också misslyckas av olika orsaker, till exempel om en klientorganisationsadministratör konfigurerar strängare inloggningsprinciper.

Interaktionen syftar till att låta användaren utföra en åtgärd. Vissa av dessa villkor är enkla för användare att lösa (till exempel acceptera användningsvillkor med ett enda klick), och vissa kan inte lösas med den aktuella konfigurationen (till exempel måste datorn i fråga ansluta till ett specifikt företagsnätverk).

MSAL exponerar ett reason fält som du kan läsa för att ge en bättre användarupplevelse, till exempel för att tala om för användaren att lösenordet har upphört att gälla eller att de måste ge medgivande för att använda vissa resurser. De värden som stöds ingår i enumen InteractionRequiredExceptionReason:

Reason Meaning Rekommenderad hantering
BasicAction Villkoret kan lösas genom användarinteraktion under det interaktiva autentiseringsflödet Anropa acquireToken med interaktiva parametrar
Ytterligare åtgärd Villkoret kan lösas genom ytterligare reparationsinteraktion med systemet, utanför det interaktiva autentiseringsflödet. Anropa acquireToken med interaktiva parametrar för att visa ett meddelande som förklarar åtgärden. Anropande program kan välja att dölja flöden som kräver additional_action om det är osannolikt att användaren slutför åtgärden.
Endast meddelande Villkoret kan inte lösas just nu. När du startar ett interaktivt autentiseringsflöde visas ett meddelande som förklarar villkoret. Anropa acquireToken med interaktiva parametrar för att visa ett meddelande som förklarar villkoret. acquireTokenCall returnerar UserCanceled-fel när användaren har läst meddelandet och stänger fönstret. Anropande program kan välja att dölja flöden som resulterar i message_only om användaren sannolikt inte kommer att dra nytta av meddelandet.
Samtycke krävs Användarmedgivande saknas eller har återkallats. Anropa alla acquireToken med interaktiva parametrar så att användaren kan ge sitt medgivande.
Användarlösenordet har upphört att gälla Användarens lösenord har upphört att gälla. Anropa acquireToken med interaktiv parameter så att användaren kan återställa lösenord
Samtycke krävs Användarmedgivande saknas eller har återkallats Anropa acquireToken med interaktiva parametrar så att användaren kan återställa lösenord
Ingen Inga ytterligare detaljer tillhandahålls. Villkoret kan lösas av användarinteraktion under det interaktiva autentiseringsflödet. Anropa acquireToken med interaktiva parametrar

Kodexempel

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