Exceções no MSAL Java

Ao processar exceções, pode usar o próprio tipo de exceção e o membro ErrorCode para distinguir entre exceções. Existem três tipos de exceções: MsalClientException, , e MsalServiceException, todas herdadas de MsalInteractionRequiredExceptionMsalException.

  • MsalClientException é gerada quando ocorre um erro local à biblioteca ou ao dispositivo.
  • O MsalServiceException é lançado quando o serviço STS devolve uma resposta de erro ou ocorre outro erro de rede.
  • O MsalInteractionRequiredException é lançado quando é necessária interação com a interface para que a autenticação tenha sucesso.

MsalServiceException

A MsalServiceException expõe os cabeçalhos HTTP devolvidos nos pedidos ao STS. Pode aceder a eles através de MsalServiceException.headers()

MsalInteractionRequiredException

Um dos códigos de estado comuns devolvidos pelo MSAL4J ao chamar AcquireTokenSilently() é InvalidGrantError. Este código de estado significa que a aplicação deve chamar novamente a biblioteca de autenticação, mas em modo interativo (usando AuthorizationCodeParameters ou DeviceCodeParameters para aplicações clientes públicas). Isto deve-se ao facto de ser necessária uma interação adicional do utilizador antes de poder emitir um token de autenticação.

Na maioria das vezes, quando o AcquireTokenSilently falha, é porque a cache de tokens não tem tokens que correspondam ao seu pedido. Os tokens de acesso expiram em 1 hora, e a AcquireTokenSilently tenta obter um novo com base num token de atualização (em termos OAuth2, este é o fluxo de "Token de Atualização"). Este fluxo também pode falhar por várias razões, por exemplo, se um administrador de inquilino configurar políticas de login mais rigorosas.

A interação visa que o utilizador realize uma ação. Algumas dessas condições são fáceis de resolver pelos utilizadores (por exemplo, aceitar os Termos de Uso com um único clique), e outras não podem ser resolvidas com a configuração atual (por exemplo, a máquina em questão precisa de se ligar a uma rede corporativa específica).

O MSAL expõe um reason campo, que pode ler para proporcionar uma melhor experiência ao utilizador, por exemplo, para informar o utilizador que a sua palavra-passe expirou ou que terá de dar consentimento para usar alguns recursos. Os valores suportados fazem parte do enum InteractionRequiredExceptionReason:

Reason Meaning Utilização recomendada
BasicAction A condição pode ser resolvida pela interação do utilizador durante o fluxo interativo de autenticação Call 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 interativo de autenticação. Chame o acquireToken com parâmetros interativos para mostrar uma mensagem que explique a ação de remediação. A aplicação de chamada pode optar por ocultar fluxos que requerem ação adicional se for pouco provável que o utilizador conclua a ação corretiva.
Apenas mensagem A condição não pode ser resolvida neste momento. Ao iniciar o fluxo interativo de autenticação, aparecerá uma mensagem a explicar a condição. Chame acquireToken com parâmetros interativos para mostrar uma mensagem que explica a condição. acquireTokenCall devolverá o erro UserCanceled depois de o utilizador ler a mensagem e fechar a janela. A aplicação de chamada pode optar por ocultar fluxos que tenham como resultado message_only se for pouco provável que o utilizador beneficie da mensagem.
Consentimento Requerido O consentimento do utilizador está em falta ou foi revogado. Chame todas as funções acquireToken com parâmetros interativos para que o utilizador possa dar o seu consentimento.
UserPasswordExpired A palavra-passe do utilizador expirou. ChameAcquireToken com parâmetro interativo para que o utilizador possa redefinir a palavra-passe
Consentimento Requerido O consentimento do utilizador está em falta ou foi revogado Call acquireToken com parâmetros interativos para que o utilizador possa redefinir a palavra-passe
None Não são fornecidos mais detalhes. A condição pode ser resolvida pela interação do utilizador durante o fluxo interativo de autenticação. 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
    }
}