Exercício - Iniciar sessão de utilizadores com o MSAL

Concluído

Neste exercício, você usa a Biblioteca de Autenticação da Microsoft para Java (MSAL4J) para adicionar autenticação em um aplicativo Web Java de exemplo e permitir que os usuários entrem com suas contas do Microsoft Entra.

O aplicativo de exemplo que você usa neste exercício é um aplicativo de servlet Java que permite que os usuários façam login e exibe o nome de usuário e as informações básicas do perfil. Ele também permite que você chame a API do Microsoft Graph para mostrar algumas informações do usuário.

Criar uma aplicação Web Java

A partir do shell ou da linha de comando:

  1. Crie uma pasta para o aplicativo.

    mkdir ~/javawebapp
    
  2. Clone o aplicativo de exemplo do repositório GitHub para a nova pasta.

    git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
    
  3. Mude para a pasta onde o aplicativo de exemplo para este exercício está localizado.

    cd ~/javawebapp/ms-identity-java-servlet-webapp-authentication/2-Authorization-I/call-graph
    

Configurar a aplicação

Para configurar o código, abra o projeto de aplicativo em seu IDE preferido, como IntelliJ ou VS Code.

  1. Abra o arquivo ./src/main/resources/authentication.properties .

  2. Na propriedade, localize a aad.authority cadeia de caracteres {enter-your-tenant-id-here}. Substitua o valor existente pelo valor de ID de diretório (locatário) - conforme mostrado na imagem a seguir - porque o aplicativo foi registrado com a opção Contas somente neste diretório organizacional.

  3. Na propriedade, localize a aad.clientId cadeia de caracteres {enter-your-client-id-here} e substitua o valor existente pelo valor da ID do Aplicativo (cliente) - o clientId valor - do aplicativo registrado copiado do portal do Azure.

    Captura de ecrã a realçar o ID da Aplicação de uma aplicação registada com o Microsoft Entra ID no portal do Azure.

  4. Na propriedade, localize a aad.secret cadeia de caracteres {enter-your-client-secret-here} e substitua o valor existente pelo valor da chave que você salvou durante a criação do aplicativo no portal do Azure.

Executar a aplicação

  1. Certifique-se de que seu servidor Tomcat está em execução e você tem privilégios para implantar um aplicativo Web nele. Certifique-se de que o endereço de host do servidor é http://localhost:8080.

  2. Compile e empacote o projeto usando o Maven:

    cd ~/javawebapp/2-Authorization-I/call-graph
    mvn clean package
    
  3. Encontre o arquivo .war resultante em ./target/msal4j-servlet-graph.war. Para implantar no Tomcat, copie este arquivo .war para o diretório /webapps/ no diretório de instalação do Tomcat e inicie o servidor Tomcat.

  4. Abra o navegador e navegue até http://localhost:8080/msal4j-servlet-graph/. Você será redirecionado para entrar com o Microsoft Entra ID. Ao iniciar sessão com êxito, deverá ver uma página como a seguinte:

    Captura de tela mostrando o nome de usuário exibido na página depois de entrar com êxito no aplicativo de exemplo.

  5. Selecione o botão Detalhes do token de ID para ver algumas das declarações decodificadas do token de ID.

Visão geral do código de autenticação

Você pode encontrar a maioria do código de autenticação no aplicativo de exemplo no diretório do java/com/microsoft/azuresamples/msal4j/ projeto. Ele contém vários servlets que fornecem os pontos de extremidade de autenticação no aplicativo para entrar, sair e manipular o retorno de chamada de redirecionamento do Microsoft Entra ID. Esses servlets usam as classes auxiliares no diretório java/com/microsoft/azuresamples/msal4j/helpers/ para chamar os métodos de autenticação fornecidos pelo MSAL. Há um filtro de servlet definido que AuthenticationFilter.java redireciona solicitações não autenticadas para rotas protegidas para uma página de erro HTTP não autorizada 401.

Para adicionar autenticação ao seu aplicativo, você precisa incluir as classes de servlet em java/com/microsoft/azuresamples/msal4j/authservlets e java/com/microsoft/azuresamples/msal4j/authwebapp diretórios, as classes auxiliares no diretório java/com/microsoft/azuresamples/msal4j/helpers/ e o filtro AuthenticationFilter.java de servlet de autenticação em seus projetos. Aqui estão mais detalhes do código de autenticação MSAL.

  1. MSAL4J está disponível no Maven. Você precisa adicionar MSAL4J como uma dependência no arquivo pom.xml do projeto:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.17.2</version>
    </dependency>
    
  2. A primeira etapa do processo de entrada é enviar uma solicitação para o ponto de extremidade do locatário do /authorize Microsoft Entra. A instância MSAL4J ConfidentialClientApplication é aproveitada para construir uma URL de solicitação de autorização. A aplicação redireciona o navegador para este URL, que é onde o utilizador inicia sessão. O código a seguir é um trecho da implementação do redirectToAuthorizationEndpoint método na AuthHelper classe.

    final ConfidentialClientApplication client = getConfidentialClientInstance();
    AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters
                                                        .builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))
                                                        .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();
    contextAdapter.redirectUser(authorizeUrl);
    
    • AuthorizationRequestUrlParameters: Parâmetros que devem ser definidos para construir um AuthorizationRequestUrlarquivo .
    • REDIRECT_URI: O URI de redirecionamento é o URI para o qual o provedor de identidade envia os tokens de segurança de volta. O Microsoft Entra ID redireciona o navegador - juntamente com o código de autenticação - para este URI depois de coletar as credenciais do usuário. Ele deve corresponder ao URI de redirecionamento no registro do aplicativo Microsoft Entra.
    • SCOPES: Escopos são permissões solicitadas pelo aplicativo. Normalmente, os três escopos são suficientes para receber uma resposta de token de openid profile offline_access ID para um login de usuário e são definidos por padrão pela MSAL.
  3. O usuário recebe um prompt de entrada pela ID do Microsoft Entra. Se a tentativa de login for bem-sucedida, o navegador do usuário será redirecionado para o ponto de extremidade de redirecionamento do nosso aplicativo com um código de autorização válido no ponto de extremidade. Em seguida, a ConfidentialClientApplication instância troca esse código de autorização por um Token de ID e um Token de Acesso do Microsoft Entra ID. O código a seguir é um trecho da implementação do processAADCallback método na AuthHelper classe.

    // First, validate the state, then parse any error codes in response, then extract the authCode. Then:
    // build the auth code params:
    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                                                        .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();
    
    // Get a client instance and leverage it to acquire the token:
    final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
    final IAuthenticationResult result = client.acquireToken(authParams).get();
    
    • AuthorizationCodeParameters: Parâmetros que devem ser definidos para trocar o Código de Autorização por um ID e/ou token de acesso.
    • authCode: O código de autorização que foi recebido no ponto de extremidade de redirecionamento.
    • REDIRECT_URI: O URI de redirecionamento usado na etapa anterior deve ser passado novamente.
    • SCOPES: Os escopos usados na etapa anterior devem ser passados novamente.
  4. Se acquireToken for bem-sucedida, as declarações de token serão extraídas. Se a verificação nonce passar, os resultados serão colocados em context - uma instância de IdentityContextData - e salvos na sessão. O aplicativo pode então instanciá-lo da sessão - por meio de uma instância de IdentityContextAdapterServlet - sempre que precisar acessá-la:

    // parse IdToken claims from the IAuthenticationResult:
    // (the next step - validateNonce - requires parsed claims)
    context.setIdTokenClaims(result.idToken());
    
    // if nonce is invalid, stop immediately! this could be a token replay!
    // if validation fails, throws exception and cancels auth:
    validateNonce(context);
    
    // set user to authenticated:
    context.setAuthResult(result, client.tokenCache().serialize());