Guida introduttiva: Acquisire un token e chiamare Microsoft Graph da un'app daemon Java

In questa guida introduttiva si scarica ed esegue un esempio di codice che illustra come un'applicazione Java può ottenere un token di accesso usando l'identità dell'app per chiamare l'API Microsoft Graph e visualizzare un elenco di utenti nella directory. L'esempio di codice dimostra come è possibile eseguire un processo o un servizio di Windows automatico con un'identità dell'applicazione invece che con un'identità dell'utente.

Diagramma che mostra il funzionamento dell'app di esempio generata da questa guida di avvio rapido.

Prerequisiti

Per eseguire questo esempio, sono necessari:

Registrare e scaricare l'app della guida introduttiva

Suggerimento

I passaggi descritti in questo articolo possono variare leggermente in base al portale da cui si inizia.

Passaggio 1: Registrare l'applicazione

Per registrare l'applicazione e aggiungere manualmente le informazioni di registrazione dell'app alla soluzione, seguire questa procedura:

  1. Accedere all'Interfaccia di amministrazione di Microsoft Entra almeno come sviluppatore di applicazioni.
  2. Se si ha accesso a più tenant, usare l’icona Impostazioni nel menu in alto per passare al tenant in cui si desidera registrare l’applicazione nel menu Directory e sottoscrizioni.
  3. Passare a Registrazioni delle applicazioni>di identità>.
  4. Seleziona Nuova registrazione.
  5. In Nome immettere un nome per l'applicazione, ad esempio Daemon-console. Tale nome, che potrebbe essere visualizzato dagli utenti dell'app, può essere modificato in un secondo momento.
  6. Selezionare Registra.
  7. In Gestisci, selezionare Certificati e segreti.
  8. In Segreti client selezionare Nuovo segreto client, immettere un nome e quindi selezionare Aggiungi. Registrare il valore del segreto in una posizione sicura per usarlo in un passaggio successivo.
  9. In Gestisci selezionare Autorizzazioni API>Aggiungi un'autorizzazione. Selezionare Microsoft Graph.
  10. Seleziona Autorizzazioni applicazione.
  11. Nel nodo Utente selezionare User.Read.All, quindi selezionare Aggiungi autorizzazioni.

Passaggio 2: Scaricare il progetto Java

Scaricare il progetto daemon Java

Passaggio 3: Configurare il progetto Java

  1. Estrarre il file ZIP in una cartella locale vicina alla radice del disco, ad esempio C:\Azure-Samples.
  2. Passare alla msal-client-credential-secret sottocartella.
  3. Modificare src\main\resources\application.properties e sostituire i valori dei campi AUTHORITY, CLIENT_IDe SECRET con il frammento di codice seguente:
  AUTHORITY=https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/
  CLIENT_ID=Enter_the_Application_Id_Here
  SECRET=Enter_the_Client_Secret_Here

Dove:

  • Enter_the_Application_Id_Here è l'ID applicazione (client) per l'applicazione registrata.
  • Enter_the_Tenant_Id_Here: sostituire questo valore con l'ID tenant o il nome del tenant (ad esempio, contoso.microsoft.com).
  • Enter_the_Client_Secret_Here: sostituire questo valore con il segreto client creato nel passaggio 1.

Suggerimento

Per trovare i valori di ID applicazione (client), ID directory (tenant), passare alla pagina Panoramica dell'app. Per generare una nuova chiave, passare alla pagina Certificati e segreti.

Se si prova a eseguire l'applicazione a questo punto, si riceverà l'errore HTTP 403 - Accesso negato: Insufficient privileges to complete the operation. Questo errore si verifica perché le autorizzazioni solo per app richiedono il consenso amministratore. È quindi necessario che un amministratore globale della directory conceda il consenso all'applicazione. Selezionare una delle opzioni seguenti in base al ruolo:

Amministratore del tenant globale

Se si è un amministratore tenant globale, passare alla pagina Autorizzazioni API in Registrazioni app e selezionare Concedi consenso amministratore per {Nome tenant} (Dove {Nome tenant} è il nome della directory).

Utente standard

Se si è un utente standard del tenant, è necessario chiedere a un amministratore globale di concedere il consenso amministratore per l'applicazione. A tale scopo, assegnare l'URL seguente all'amministratore:

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

Dove:

  • Enter_the_Tenant_Id_Here: sostituire questo valore con l'ID tenant o il nome del tenant (ad esempio, contoso.microsoft.com)
  • Enter_the_Application_Id_Here è l'ID applicazione (client) per l'applicazione registrata.

Passaggio 5: Eseguire l'applicazione

È possibile testare l'esempio direttamente eseguendo il metodo main di ClientCredentialGrant.java dall'IDE.

Dalla shell o della riga di comando:

$ mvn clean compile assembly:single

Verrà generato un msal-client-credential-secret-1.0.0.jar file nella /targets directory. Eseguire questa operazione usando il file eseguibile Java come illustrato di seguito:

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

Dopo l'esecuzione, l'applicazione deve visualizzare l'elenco degli utenti nel tenant configurato.

Importante

Questa applicazione della guida introduttiva usa un segreto client per identificarsi come client riservato. Poiché il segreto client viene aggiunto come testo normale ai file di progetto, per motivi di sicurezza è consigliabile usare un certificato anziché un segreto client prima di considerare l'applicazione come applicazione di produzione. Per altre informazioni su come usare un certificato, vedere queste istruzioni nello stesso repository GitHub per questo esempio, ma nella seconda cartella MSAL-client-credential-certificate.

Ulteriori informazioni

MSAL Java

MSAL Java è la libreria usata per accedere agli utenti e richiedere token usati per accedere a un'API protetta da Microsoft Identity Platform. Come descritto, questo avvio rapido richiede i token usando l'identità propria dell'applicazione invece delle autorizzazioni delegate. Il flusso di autenticazione usato in questo caso è noto come flusso delle credenziali client OAuth. Per altre informazioni su come usare MSAL Java con app daemon, vedere questo articolo.

Aggiungere MSAL4J all'applicazione usando Maven o Gradle per gestire le dipendenze apportando le modifiche seguenti al file pom.xml (Maven) o build.gradle (Gradle) dell'applicazione.

In pom.xml:

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

In build.gradle:

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

Inizializzazione della libreria MSAL

Aggiungere un riferimento a MSAL per Java aggiungendo il codice seguente all'inizio del file in cui verrà usato MSAL4J:

import com.microsoft.aad.msal4j.*;

Inizializzare quindi la libreria MSAL usando il codice seguente:

IClientCredential credential = ClientCredentialFactory.createFromSecret(CLIENT_SECRET);

ConfidentialClientApplication cca =
        ConfidentialClientApplication
                .builder(CLIENT_ID, credential)
                .authority(AUTHORITY)
                .build();
Dove: Descrizione
CLIENT_SECRET Segreto client creato per l'applicazione.
CLIENT_ID ID applicazione (client) per l'applicazione registrata. È possibile trovare questo valore nella pagina Panoramica dell'app.
AUTHORITY Endpoint del servizio token di sicurezza per l'utente da autenticare. In genere https://login.microsoftonline.com/{tenant} per il cloud pubblico, dove {tenant} è il nome del tenant o l'ID tenant.

Richiesta di token

Per richiedere un token con l'identità dell'app, usare il metodo 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;
Dove: Descrizione
SCOPE Contiene gli ambiti richiesti. Per i client riservati, questo deve usare il formato simile a per {Application ID URI}/.default indicare che gli ambiti richiesti sono quelli definiti in modo statico nell'oggetto app (per Microsoft Graph, {Application ID URI} punta a https://graph.microsoft.com). Per le API Web personalizzate, {Application ID URI} è definito nella sezione Esporre un'API in Registrazioni app.

Assistenza e supporto

Se è necessaria assistenza, si vuole segnalare un problema o si vogliono ottenere informazioni sulle opzioni di supporto, vedere Assistenza e supporto per gli sviluppatori.

Passaggi successivi

Per altre informazioni sulle applicazioni daemon, vedere la pagina di destinazione dello scenario