Excepciones de MSAL Java

Al procesar excepciones, puede usar el propio tipo de excepción y el miembro ErrorCode para distinguir entre excepciones. Hay tres tipos de excepciones: MsalClientException, MsalServiceExceptiony MsalInteractionRequiredException, todos los que heredan de MsalException.

  • MsalClientException se lanza cuando se produce un error en la biblioteca o en el dispositivo.
  • MsalServiceException se produce cuando el servicio STS devuelve una respuesta de error u otro error de red.
  • MsalInteractionRequiredException se produce cuando se requiere la interacción de la interfaz de usuario para que la autenticación se realice correctamente.

MsalServiceException

MsalServiceException expone los encabezados HTTP devueltos por las solicitudes al STS. Puede acceder a ellos mediante MsalServiceException.headers()

MsalInteractionRequiredException

Uno de los códigos de estado comunes devueltos por MSAL4J al llamar a AcquireTokenSilently() es InvalidGrantError. Este código de estado significa que la aplicación debe llamar de nuevo a la biblioteca de autenticación, pero en modo interactivo (uso de AuthorizationCodeParameters o DeviceCodeParameters para aplicaciones cliente públicas). Esto se debe a que se requiere interacción adicional del usuario antes de que se pueda emitir un token de autenticación.

La mayoría de las veces que se produce un error en AcquireTokenSilently, se debe a que la caché de tokens no tiene tokens que coincidan con la solicitud. Los tokens de acceso expiran en 1 hora y AcquireTokenSilently intentará capturar uno nuevo basado en un token de actualización (en términos de OAuth2, este es el "flujo del token de actualización"). Este flujo también puede producir un error por varios motivos, por ejemplo, si un administrador de inquilinos configura directivas de inicio de sesión más estrictas.

La interacción tiene como objetivo hacer que el usuario realice una acción. Algunas de esas condiciones son fáciles de resolver (por ejemplo, aceptar términos de uso con un solo clic) y algunas no se pueden resolver con la configuración actual (por ejemplo, la máquina en cuestión debe conectarse a una red corporativa específica).

MSAL expone un reason campo, que puede leer para proporcionar una mejor experiencia de usuario, por ejemplo, para indicar al usuario que ha expirado su contraseña o que tendrá que proporcionar consentimiento para usar algunos recursos. Los valores admitidos forman parte de la enumeración InteractionRequiredExceptionReason:

Reason Meaning Uso recomendado
BasicAction La interacción del usuario puede resolver la condición durante el flujo de autenticación interactiva. Llame a acquireToken con parámetros interactivos
AdditionalAction La condición se puede resolver mediante una interacción correctiva adicional con el sistema, fuera del flujo de autenticación interactiva. Llame a acquireToken con parámetros interactivos para mostrar un mensaje que explica la acción correctiva. La aplicación que realiza la llamada puede optar por ocultar los flujos que requieren additional_action si es poco probable que el usuario complete la acción correctiva.
Solo mensaje La condición no se puede resolver en este momento. El inicio del flujo de autenticación interactiva mostrará un mensaje que explica la condición. Llame a acquireToken con parámetros interactivos para mostrar un mensaje que explica la condición. acquireTokenCall devolverá el error UserCanceled después de que el usuario lea el mensaje y cierre la ventana. La aplicación de llamada puede optar por ocultar los flujos que dan lugar a message_only si es poco probable que el usuario se beneficie del mensaje.
Consentimiento requerido Falta el consentimiento del usuario o se ha revocado. Llamar a todos los acquireToken con parámetros interactivos para que el usuario dé su consentimiento.
La contraseña de usuario ha caducado La contraseña del usuario ha expirado. Llame a acquireToken con parámetro interactivo para que el usuario pueda restablecer la contraseña.
Consentimiento requerido Falta el consentimiento del usuario o se ha revocado Llame a acquireToken con parámetros interactivos para que el usuario pueda restablecer la contraseña.
Ninguno No se proporcionan más detalles. La interacción del usuario puede resolver la condición durante el flujo de autenticación interactiva. Llame a acquireToken con parámetros interactivos

Ejemplo de código

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