Inicio rápido: Adquisición de un token y llamada a Microsoft Graph desde una aplicación demonio de Java

En este inicio rápido descargará y ejecutará un código de ejemplo que muestra cómo puede obtener una aplicación de Java un token de acceso mediante la identidad de la aplicación para llamar a Microsoft Graph API y mostrar una lista de usuarios en el directorio. En el ejemplo de código se muestra cómo se puede ejecutar un trabajo desatendido o un servicio de Windows con una identidad de aplicación, en lugar de la identidad de un usuario.

Diagram showing how the sample app generated by this quickstart works.

Requisitos previos

Para ejecutar esta muestra, necesita:

Registro y descarga de la aplicación de inicio rápido

Sugerencia

Los pasos de este artículo pueden variar ligeramente en función del portal desde donde comienza.

Paso 1: Registro de la aplicación

Para registrar la aplicación y agregar la información de registro de la aplicación a la solución de forma manual, siga estos pasos:

  1. Inicie sesión en el Centro de administración de Microsoft Entra al menos como Desarrollador de aplicaciones.
  2. Si tiene acceso a varios inquilinos, use el icono Configuración del menú superior para cambiar al inquilino en el que desea registrar la aplicación desde el menú Directorios y suscripciones.
  3. Vaya aIdentidad>Aplicaciones>Registros de aplicaciones.
  4. Seleccione Nuevo registro.
  5. Escriba el Nombre de la aplicación, por ejemplo Daemon-console. Los usuarios de la aplicación pueden ver este nombre, el cual se puede cambiar más tarde.
  6. Seleccione Registrar.
  7. En Administrar, seleccione Certificados y secretos.
  8. En Secretos de cliente, seleccione Nuevo secreto de cliente, escriba un nombre y seleccione Agregar. Grabe el valor del secreto en una ubicación segura para usarlo en un paso posterior.
  9. En Administrar, seleccione Permisos de API>Add a permission (Agregar un permiso). Seleccione Microsoft Graph.
  10. Seleccione Permisos de aplicación.
  11. En el nodo Usuario, seleccione User.Read.All y, luego, Agregar permisos.

Paso 2: Descarga del proyecto de Java

Descargar el proyecto de demonio de Java

Paso 3: Configuración del proyecto de Java

  1. Extraiga el archivo ZIP en una carpeta local que esté próxima a la raíz del disco, como C:\Azure-Samples.
  2. Vaya a la subcarpeta msal-client-credential-secret.
  3. Edite src\main\resources\application.properties y sustituya los valores de los campos AUTHORITY, CLIENT_ID y SECRET por el siguiente fragmento de código:
  AUTHORITY=https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/
  CLIENT_ID=Enter_the_Application_Id_Here
  SECRET=Enter_the_Client_Secret_Here

Donde:

  • Enter_the_Application_Id_Here: es el identificador de aplicación (cliente) de la aplicación que registró.
  • Enter_the_Tenant_Id_Here: sustituya este valor por el identificador de inquilino o el nombre de inquilino (por ejemplo, contoso.microsoft.com).
  • Enter_the_Client_Secret_Here: sustituya este valor por el secreto de cliente creado en el paso 1.

Sugerencia

Para encontrar los valores de Id. de aplicación (cliente) e Id. de directorio (inquilino), vaya a la página Información general de la aplicación. Para generar una nueva clave, vaya a la página Certificates & secrets (Certificados y secretos).

Si intenta ejecutar la aplicación en este momento, recibirá un error HTTP 403 - Prohibido: Insufficient privileges to complete the operation. Este error se produce porque cualquier permiso de solo aplicación requiere consentimiento del administrador: un administrador global del directorio debe dar su consentimiento a la aplicación. Seleccione una de las opciones siguientes según el rol:

Administrador de inquilinos global

Si es Administrador de inquilinos global, vaya a la página Permisos de API de Registros de aplicaciones y seleccione Conceder consentimiento del administrador para {Tenant Name} (donde {Tenant Name} es el nombre del directorio).

Usuario estándar

Si es un usuario estándar del inquilino, debe pedir a un administrador global que conceda el consentimiento del administrador para la aplicación. Para ello, proporcione la siguiente dirección URL a su administrador:

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

Donde:

  • Enter_the_Tenant_Id_Here: sustituya este valor por el identificador de inquilino o el nombre de inquilino (por ejemplo, contoso.microsoft.com).
  • Enter_the_Application_Id_Here: es el identificador de aplicación (cliente) de la aplicación que registró.

Paso 5: Ejecución de la aplicación

Puede probar el ejemplo directamente mediante la ejecución del método main de ClientCredentialGrant.Java desde el IDE.

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

$ mvn clean compile assembly:single

Se generará el archivo msal-client-credential-secret-1.0.0.jar en el directorio /targets. Ejecútelo con el archivo ejecutable de Java como se indica a continuación:

$ java -jar msal-client-credential-secret-1.0.0.jar

Después de la ejecución, la aplicación debe mostrar la lista de usuarios del inquilino configurado.

Importante

Esta aplicación de inicio rápido usa un secreto de cliente para identificarse como cliente confidencial. Como el secreto de cliente se agrega como texto sin formato a los archivos del proyecto, por motivos de seguridad, se recomienda que use un certificado en lugar de un secreto de cliente antes de considerar el uso de la aplicación en producción. Para más información sobre cómo usar un certificado, consulte estas instrucciones en el mismo repositorio de GitHub que este ejemplo, pero en la segunda carpeta, MSAL-client-credential-certificate.

Más información

Java de MSAL

MSAL para Java es la biblioteca que se usa para iniciar la sesión de los usuarios y solicitar los tokens que se usan para acceder a una API protegida por la Plataforma de identidad de Microsoft. Como se ha descrito, en este inicio rápido se solicitan tokens mediante la propia identidad de la aplicación, en lugar de permisos delegados. El flujo de autenticación usado en este caso se conoce como flujo de OAuth de credenciales de cliente . Para más información sobre cómo usar MSAL para Java con aplicaciones de demonio, consulte este artículo.

Agregue MSAL4J a la aplicación con Maven o Gradle para administrar las dependencias al realizar los cambios siguientes en el archivo pom.xml (Maven) o build.gradle (Gradle) de la aplicación.

En pom.xml:

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>msal4j</artifactId>
    <version>1.0.0</version>
</dependency>

En build.gradle:

compile group: 'com.microsoft.azure', name: 'msal4j', version: '1.0.0'

Inicialización de MSAL

Para agregar una referencia a MSAL for Java, incorpore el código siguiente al principio del archivo en el que va a usar MSAL4J:

import com.microsoft.aad.msal4j.*;

A continuación, realice la inicialización de MSAL con el siguiente código:

IClientCredential credential = ClientCredentialFactory.createFromSecret(CLIENT_SECRET);

ConfidentialClientApplication cca =
        ConfidentialClientApplication
                .builder(CLIENT_ID, credential)
                .authority(AUTHORITY)
                .build();
Donde: Descripción
CLIENT_SECRET Es el secreto de cliente creado para la aplicación.
CLIENT_ID Es el valor de Id. de aplicación (cliente) de la aplicación registrada. Puede encontrar este valor en la página Información general de la aplicación.
AUTHORITY El punto de conexión STS para el usuario que se autenticará. Normalmente https://login.microsoftonline.com/{tenant} en la nube pública, donde {tenant} es el nombre o el identificador del inquilino.

Solicitud de tokens

Para solicitar un token mediante la identidad de la aplicación, use el método acquireToken:

IAuthenticationResult result;
     try {
         SilentParameters silentParameters =
                 SilentParameters
                         .builder(SCOPE)
                         .build();

         // try to acquire token silently. This call will fail since the token cache does not
         // have a token for the application you are requesting an access token for
         result = cca.acquireTokenSilently(silentParameters).join();
     } catch (Exception ex) {
         if (ex.getCause() instanceof MsalException) {

             ClientCredentialParameters parameters =
                     ClientCredentialParameters
                             .builder(SCOPE)
                             .build();

             // Try to acquire a token. If successful, you should see
             // the token information printed out to console
             result = cca.acquireToken(parameters).join();
         } else {
             // Handle other exceptions accordingly
             throw ex;
         }
     }
     return result;
Donde: Descripción
SCOPE Contiene los ámbitos solicitados. Con los clientes confidenciales, se debe usar un formato similar a {Application ID URI}/.default para indicar que los ámbitos que se solicitan son los definidos estáticamente en el objeto de aplicación (con Microsoft Graph, {Application ID URI} apunta a https://graph.microsoft.com). Con API web personalizadas, {Application ID URI} se define en la sección Exponer una API de Registros de aplicaciones.

Ayuda y soporte técnico

Si necesita ayuda, desea informar de un problema o desea obtener información sobre las opciones de soporte técnico, consulte Opciones de ayuda y soporte técnico para desarrolladores.

Pasos siguientes

Para más información sobre las aplicaciones demonio, consulte la página de aterrizaje del escenario.