Exceções no MSAL Java

Ao processar exceções, você pode usar o próprio tipo de exceção e o membro ErrorCode para distinguir entre exceções. Há três tipos de exceções: MsalClientException, MsalServiceExceptione MsalInteractionRequiredException, todos os quais herdam de MsalException.

  • MsalClientException é lançada quando ocorre um erro local à biblioteca ou ao dispositivo.
  • MsalServiceException é gerado quando o serviço STS retorna uma resposta de erro ou outro erro de rede ocorre.
  • MsalInteractionRequiredException é gerada quando a interação com a interface do usuário é necessária para que a autenticação seja bem-sucedida.

MsalServiceException

MsalServiceException expõe cabeçalhos HTTP que retornaram as solicitações para o STS. Você pode acessá-los por meio de MsalServiceException.headers()

MsalInteractionRequiredException

Um dos códigos de status comuns retornados do MSAL4J ao chamar AcquireTokenSilently() é InvalidGrantError. Esse código de status significa que o aplicativo deve chamar a biblioteca de autenticação novamente, mas no modo interativo (usando AuthorizationCodeParameters ou DeviceCodeParameters para aplicativos cliente públicos). Isso ocorre porque a interação adicional do usuário é necessária antes que um token de autenticação possa ser emitido.

Na maioria das vezes, quando AcquireTokenSilently falha, é porque o cache de token não tem tokens correspondentes à sua solicitação. Os tokens de acesso expiram em 1 hora e AcquireTokenSilently tentará buscar um novo com base em um token de atualização (em termos OAuth2, este é o fluxo "Token de Atualização"). Esse fluxo também pode falhar por vários motivos, por exemplo, se um administrador de locatários configurar políticas de logon mais rigorosas.

A interação visa fazer com que o usuário faça uma ação. Algumas dessas condições são fáceis de serem resolvidas pelos usuários (por exemplo, aceitem termos de uso com um único clique) e outras não podem ser resolvidas com a configuração atual (por exemplo, o computador em questão precisa se conectar a uma rede corporativa específica).

A MSAL expõe um reason campo, que você pode ler para fornecer uma melhor experiência do usuário, por exemplo, para informar ao usuário que sua senha expirou ou que ele precisará fornecer consentimento para usar alguns recursos. Os valores com suporte fazem parte da enumeração InteractionRequiredExceptionReason:

Reason Meaning Tratamento recomendado
BasicAction A condição pode ser resolvida pela interação do usuário durante o fluxo de autenticação interativa Chamar acquireToken com parâmetros interativos
Ação adicional A condição pode ser resolvida por interação corretiva adicional com o sistema, fora do fluxo de autenticação interativa. Chame acquireToken com parâmetros interativos para mostrar uma mensagem que explica a ação corretiva. O aplicativo da chamada pode optar por ocultar fluxos que exigem additional_action caso seja improvável que o usuário conclua a ação corretiva.
Somente mensagem A condição não pode ser resolvida no momento. Iniciar o fluxo de autenticação interativa mostrará uma mensagem explicando a condição. Chame acquireToken com parâmetros interativos para mostrar uma mensagem que explica a condição. acquireTokenCall retornará o erro UserCanceled após o usuário ler a mensagem e fechar a janela. O aplicativo da chamada pode optar por ocultar os fluxos que resultam em message_only caso seja improvável que o usuário se beneficie da mensagem.
Consentimento necessário O consentimento do usuário está ausente ou foi revogado. Chame todos os acquireToken com parâmetros interativos para que o usuário possa dar seu consentimento.
Senha do usuário expirada A senha do usuário expirou. Chamar acquireToken com parâmetro interativo para que o usuário possa redefinir a senha
Consentimento necessário O consentimento do usuário está ausente ou foi revogado Chamar acquireToken com parâmetros interativos para que o usuário possa redefinir a senha
None Não são fornecidos mais detalhes. A condição pode ser resolvida pela interação do usuário durante o fluxo de autenticação interativa. Chamar acquireToken com parâmetros interativos

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