Ejercicio: Inicio de sesión de usuarios con MSAL

Completado

En este ejercicio, usará la Biblioteca de autenticación de Microsoft para Java (MSAL4J) a fin de agregar autenticación en una aplicación web de Java de ejemplo y permitir que los usuarios inicien sesión con sus cuentas de Microsoft Entra.

La aplicación de ejemplo que usará en este ejercicio es una aplicación de servlet de Java que permite a los usuarios iniciar sesión y muestra el nombre de usuario y la información básica del perfil. También le permite llamar a la API Microsoft Graph para mostrar información del usuario.

Creación de una aplicación web de Java

Desde el shell o la línea de comandos, ejecute:

  1. Cree una carpeta para la aplicación.

    mkdir ~/javawebapp
    
  2. Clone la aplicación de ejemplo del repositorio de GitHub en la nueva carpeta.

    git clone https://github.com/Azure-Samples/ms-identity-java-servlet-webapp-authentication.git ~/javawebapp
    
  3. Cambie a la carpeta donde se encuentra la aplicación de ejemplo para este ejercicio.

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

Configuración de la aplicación

Para configurar el código, abra el proyecto de aplicación en el IDE que prefiera, como IntelliJ o VS Code.

  1. Abra el archivo ./src/main/resources/authentication.properties.

  2. En la propiedad aad.authority, busque la cadena {enter-your-tenant-id-here}. Reemplace el valor existente por el valor de identificador del directorio (inquilino) (como se muestra en la imagen siguiente), ya que la aplicación se ha registrado con la opción Solo las cuentas de este directorio organizativo.

  3. En la propiedad aad.clientId, busque la cadena {enter-your-client-id-here} y reemplace el valor existente por el valor de id. de aplicación (cliente), el valor clientId, de la aplicación registrada copiada de Azure Portal.

    Recorte de pantalla en el que se resalta el identificador de aplicación de una aplicación registrada con Microsoft Entra ID en Azure Portal.

  4. En la propiedad aad.secret, busque la cadena {enter-your-client-secret-here} y reemplace el valor existente por el valor de clave que ha guardado durante la creación de la aplicación en Azure Portal.

Ejecución de la aplicación

  1. Asegúrese de que el servidor Tomcat está en ejecución y de que tiene privilegios para implementar una aplicación web en él. Asegúrese de que la dirección del host del servidor es http://localhost:8080.

  2. Compile y empaquete el proyecto mediante Maven:

    cd ~/javawebapp/2-Authorization-I/call-graph
    mvn clean package
    
  3. Busque el archivo .war resultante en ./target/msal4j-servlet-graph.war. Para realizar la implementación en Tomcat, copie este archivo .war en el directorio /webapps/ del directorio de instalación de Tomcat e inicie el servidor Tomcat.

  4. Abra el explorador web y vaya a http://localhost:8080/msal4j-servlet-graph/. Se le redirigirá para iniciar sesión con Microsoft Entra ID. Al iniciar sesión correctamente, debería ver la siguiente pantalla:

    Captura de pantalla en la que se muestra el nombre de usuario en la página después de iniciar sesión correctamente en la aplicación de ejemplo.

  5. Seleccione el botón Detalles del token de identificador para ver algunas de las notificaciones descodificadas del token de identificador.

Introducción al código de autenticación

Puede encontrar la mayor parte del código de autenticación de la aplicación de ejemplo en el directorio java/com/microsoft/azuresamples/msal4j/ del proyecto. Contiene varios servlets que proporcionan los puntos de conexión de autenticación de la aplicación para iniciar sesión, cerrar sesión y controlar la devolución de llamada de redireccionamiento desde Microsoft Entra ID. Estos servlets usan las clases auxiliares del directorio java/com/microsoft/azuresamples/msal4j/helpers/ para llamar a los métodos de autenticación proporcionados por MSAL. Hay un filtro de servlet definido en AuthenticationFilter.java que redirige las solicitudes no autenticadas a rutas protegidas a una página de error HTTP 401 no autorizado.

Para agregar autenticación a la aplicación, tendrá que incluir las clases de servlet en los directorios java/com/microsoft/azuresamples/msal4j/authservlets y java/com/microsoft/azuresamples/msal4j/authwebapp, las clases auxiliares en el directorio java/com/microsoft/azuresamples/msal4j/helpers/ y el filtro de servlet de autenticación AuthenticationFilter.java en los proyectos. A continuación se muestran más detalles del código de autenticación de MSAL.

  1. MSAL4J está disponible en Maven. Debe agregar MSAL4J como dependencia en el archivo pom.xml del proyecto:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.17.2</version>
    </dependency>
    
  2. El primer paso del proceso de inicio de sesión consiste en enviar una solicitud al punto de conexión /authorize del inquilino de Microsoft Entra. La instancia ConfidentialClientApplication de MSAL4J se aprovecha para construir una dirección URL de solicitud de autorización. La aplicación redirige el explorador a esta dirección URL, que es donde el usuario inicia sesión. El código siguiente es un extracto de la implementación del método redirectToAuthorizationEndpoint en la clase AuthHelper.

    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 se deben establecer para crear una AuthorizationRequestUrl.
    • REDIRECT_URI: El URI de redirección es el URI al que el proveedor de identidades devuelve los tokens de seguridad. Microsoft Entra ID redirige el explorador (junto con el código de autenticación) a este URI después de recopilar las credenciales de usuario. Debe coincidir con el URI de redirección en el registro de aplicaciones de Microsoft Entra.
    • SCOPES: Los ámbitos son permisos solicitados por la aplicación. Normalmente, los tres ámbitos openid profile offline_access son suficientes para recibir una respuesta de token de identificador para un inicio de sesión de usuario y MSAL los establece de forma predeterminada.
  3. Microsoft Entra ID presenta al usuario un mensaje de inicio de sesión. Si el intento de inicio de sesión se realiza correctamente, el explorador del usuario se redirige al punto de conexión de redireccionamiento de la aplicación con un código de autorización válido en el punto de conexión. Después, la instancia de ConfidentialClientApplication intercambia este código de autorización por un token de identificador y un token de acceso de Microsoft Entra ID. El código siguiente es un extracto de la implementación del método processAADCallback en la clase AuthHelper.

    // 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 se deben establecer para intercambiar el código de autorización por un identificador o token de acceso.
    • authCode: el código de autorización que se ha recibido en el punto de conexión de redireccionamiento.
    • REDIRECT_URI: el URI de redireccionamiento que se ha usado en el paso anterior se debe pasar de nuevo.
    • SCOPES: los ámbitos que se han usado en el paso anterior se deben pasar de nuevo.
  4. Si acquireToken se realiza correctamente, se extraen las notificaciones de token. Si se supera la comprobación nonce, los resultados se colocan en context, una instancia de IdentityContextData, y se guardan en la sesión. Después, la aplicación puede crear una instancia de esto a partir de la sesión (por medio de una instancia de IdentityContextAdapterServlet) siempre que necesite acceder a ella:

    // 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());