Créer des applications Java avec Microsoft Graph et l’authentification d’application uniquement
Ce tutoriel vous apprend à créer une application console Java qui utilise l’API Microsoft Graph pour accéder aux données à l’aide de l’authentification d’application uniquement. L’authentification d’application uniquement est un bon choix pour les services en arrière-plan ou les applications qui doivent accéder aux données de tous les utilisateurs d’une organisation.
Remarque
Pour savoir comment utiliser Microsoft Graph pour accéder aux données au nom d’un utilisateur, consultez ce tutoriel sur l’authentification de l’utilisateur (déléguée).
Dans ce didacticiel, vous allez :
Conseil
Au lieu de suivre ce didacticiel, vous pouvez télécharger ou cloner le dépôt GitHub et suivre les instructions du fichier LISEZ-MOI pour inscrire une application et configurer le projet.
Configuration requise
Avant de commencer ce didacticiel, vous devez avoir installé le kit de développement Java SE (JDK) et Gradle sur votre ordinateur de développement.
Vous devez également disposer d’un compte professionnel ou scolaire Microsoft avec le rôle Administrateur général. Si vous n’avez pas de locataire Microsoft 365, vous pouvez être éligible pour un client via le Programme pour les développeurs Microsoft 365 ; Pour plus d’informations, consultez la FAQ. Vous pouvez également vous inscrire à un essai gratuit de 1 mois ou acheter un plan Microsoft 365.
Remarque
Ce tutoriel a été écrit avec OpenJDK version 17.0.2 et Gradle 7.4.2. Les étapes décrites dans ce guide peuvent fonctionner avec d’autres versions, mais elles n’ont pas été testées.
Inscrire l’application sur le portail
Dans cet exercice, vous allez inscrire une nouvelle application dans Azure Active Directory pour activer l’authentification d’application uniquement. Vous pouvez inscrire une application à l’aide du Centre d’administration Microsoft Entra ou à l’aide du Kit de développement logiciel (SDK) Microsoft Graph PowerShell.
Inscrire l’application pour l’authentification d’application uniquement
Dans cette section, vous allez inscrire une application qui prend en charge l’authentification d’application uniquement à l’aide du flux d’informations d’identification du client.
Ouvrez un navigateur et accédez au Centre d’administration Microsoft Entra et connectez-vous à l’aide d’un compte d’administrateur général.
Sélectionnez Id Microsoft Entra dans le volet de navigation de gauche, développez Identité, Applications, puis inscriptions d’applications.
Sélectionnez Nouvelle inscription. Entrez un nom pour votre application, par exemple .
Graph App-Only Auth Tutorial
Définissez Types de comptes pris en chargesur Comptes dans cet annuaire organisationnel uniquement.
Laissez Redirect URI vide.
Sélectionner Inscription. Dans la page Vue d’ensemble de l’application, copiez la valeur de l’ID d’application (client) et de l’ID d’annuaire (locataire) et enregistrez-les. Vous aurez besoin de ces valeurs à l’étape suivante.
Sélectionnez Autorisations de l’API dans le volet de navigation gauche sous Gérer.
Supprimez l’autorisation User.Read par défaut sous Autorisations configurées en sélectionnant les points de suspension (...) dans sa ligne et en sélectionnant Supprimer l’autorisation.
Sélectionnez Ajouter une autorisation, puis Microsoft Graph.
Sélectionnez Autorisations d’application.
Sélectionnez User.Read.All, puis Ajouter des autorisations.
Sélectionnez Accorder le consentement de l’administrateur pour..., puis sélectionnez Oui pour fournir le consentement de l’administrateur pour l’autorisation sélectionnée.
Sélectionnez Certificats et secrets sous Gérer, puis sélectionnez Nouvelle clé secrète client.
Entrez une description, choisissez une durée, puis sélectionnez Ajouter.
Copiez le secret à partir de la colonne Valeur . Vous en aurez besoin dans les étapes suivantes.
Importante
Ce secret client n’apparaîtra plus jamais, aussi veillez à le copier maintenant.
Remarque
Notez que, contrairement aux étapes de l’inscription à l’authentification utilisateur, dans cette section, vous avez configuré des autorisations Microsoft Graph sur l’inscription de l’application. Cela est dû au fait que l’authentification d’application uniquement utilise le flux d’informations d’identification du client, ce qui nécessite que les autorisations soient configurées lors de l’inscription de l’application. Pour plus d’informations, consultez l’étendue .default .
Créer une application de console Java
Dans cette section, vous allez créer une application console Java de base.
Ouvrez votre interface de ligne de commande (CLI) dans un répertoire dans lequel vous souhaitez créer le projet. Exécutez la commande suivante pour créer un projet Gradle.
gradle init --dsl groovy --test-framework junit --type java-application --project-name graphapponlytutorial --package graphapponlytutorial
Une fois le projet créé, vérifiez qu’il fonctionne en exécutant la commande suivante pour exécuter l’application dans votre interface CLI.
./gradlew --console plain run
Si cela fonctionne, l’application doit générer
Hello World.
.
Installer les dépendances
Avant de continuer, ajoutez des dépendances supplémentaires que vous utiliserez ultérieurement.
- Bibliothèque de client Azure Identity pour Java afin d’authentifier l’utilisateur et d’acquérir des jetons d’accès.
- Kit de développement logiciel (SDK) Microsoft Graph pour Java afin d’effectuer des appels à Microsoft Graph.
Ouvrez ./app/build.gradle. Mettez à jour la
dependencies
section pour ajouter ces dépendances.dependencies { // Use JUnit test framework. testImplementation 'junit:junit:4.13.2' // This dependency is used by the application. implementation 'com.google.guava:guava:33.2.1-jre' implementation 'com.azure:azure-identity:1.13.0' implementation 'com.microsoft.graph:microsoft-graph:6.13.0' }
Ajoutez ce qui suit à la fin de ./app/build.gradle.
run { standardInput = System.in }
La prochaine fois que vous générerez le projet, Gradle téléchargera ces dépendances.
Charger les paramètres de l’application
Dans cette section, vous allez ajouter les détails de l’inscription de votre application au projet.
Créez un répertoire nommé graphapponlytutorial dans le répertoire ./app/src/main/resources .
Créez un fichier dans le répertoire ./app/src/main/resources/graphapponlytutorial nommé oAuth.properties, puis ajoutez le texte suivant dans ce fichier.
app.clientId=YOUR_CLIENT_ID_HERE app.clientSecret=YOUR_CLIENT_SECRET_HERE app.tenantId=YOUR_TENANT_ID_HERE
Mettez à jour les valeurs en fonction du tableau suivant.
Paramètre Valeur app.clientId
ID client de l’inscription de votre application app.tenantId
ID de locataire de votre organisation app.clientSecret
Clé secrète client Importante
Si vous utilisez un contrôle de code source tel que Git, il serait temps d’exclure le fichier oAuth.properties du contrôle de code source afin d’éviter la fuite par inadvertance de votre ID d’application.
Concevoir l’application
Dans cette section, vous allez créer un menu simple basé sur la console.
Ouvrez ./app/src/main/java/graphapponlytutorial/App.java et ajoutez les instructions suivantes
import
.package graphapponlytutorial; import java.io.IOException; import java.util.InputMismatchException; import java.util.Properties; import java.util.Scanner; import com.microsoft.graph.models.User;
Remplacez la fonction
main
existante par ce qui suit.public static void main(String[] args) { System.out.println("Java App-Only Graph Tutorial"); System.out.println(); final Properties oAuthProperties = new Properties(); try { oAuthProperties.load(App.class.getResourceAsStream("oAuth.properties")); } catch (IOException e) { System.out.println("Unable to read OAuth configuration. Make sure you have a properly formatted oAuth.properties file. See README for details."); return; } initializeGraph(oAuthProperties); Scanner input = new Scanner(System.in); int choice = -1; while (choice != 0) { System.out.println("Please choose one of the following options:"); System.out.println("0. Exit"); System.out.println("1. Display access token"); System.out.println("2. List users"); System.out.println("3. Make a Graph call"); try { choice = input.nextInt(); } catch (InputMismatchException ex) { // Skip over non-integer input } input.nextLine(); // Process user choice switch(choice) { case 0: // Exit the program System.out.println("Goodbye..."); break; case 1: // Display access token displayAccessToken(); break; case 2: // List users listUsers(); break; case 3: // Run any Graph code makeGraphCall(); break; default: System.out.println("Invalid choice"); } } input.close(); }
Ajoutez les méthodes d’espace réservé suivantes à la fin du fichier. Vous les implémenterez dans les étapes ultérieures.
private static void initializeGraph(Properties properties) { // TODO } private static void displayAccessToken() { // TODO } private static void listUsers() { // TODO } private static void makeGraphCall() { // TODO }
Cela implémente un menu de base et lit le choix de l’utilisateur à partir de la ligne de commande.
- Supprimez ./app/src/test/java/graphapponlytutorial/AppTest.java.
Ajouter l’authentification d’application uniquement
Dans cette section, vous allez ajouter l’authentification d’application uniquement à l’application. Cela est nécessaire pour obtenir le jeton d’accès OAuth nécessaire pour appeler Microsoft Graph. Dans cette étape, vous allez intégrer la bibliothèque de client Azure Identity pour Java dans l’application et configurer l’authentification pour le Kit de développement logiciel (SDK) Microsoft Graph pour Java.
Configurer le client Graph pour l’authentification d’application uniquement
Dans cette section, vous allez utiliser la ClientSecretCredential
classe pour demander un jeton d’accès à l’aide du flux d’informations d’identification du client.
Créez un fichier dans le répertoire ./app/src/main/java/graphapponlytutorial nommé Graph.java et ajoutez le code suivant à ce fichier.
package graphapponlytutorial; import java.util.Properties; import com.azure.core.credential.AccessToken; import com.azure.core.credential.TokenRequestContext; import com.azure.identity.ClientSecretCredential; import com.azure.identity.ClientSecretCredentialBuilder; import com.microsoft.graph.models.UserCollectionResponse; import com.microsoft.graph.serviceclient.GraphServiceClient;
Ajoutez une définition de classe Graph vide.
public class Graph { }
Ajoutez le code suivant à la classe Graph.
private static Properties _properties; private static ClientSecretCredential _clientSecretCredential; private static GraphServiceClient _appClient; public static void initializeGraphForAppOnlyAuth(Properties properties) throws Exception { // Ensure properties isn't null if (properties == null) { throw new Exception("Properties cannot be null"); } _properties = properties; if (_clientSecretCredential == null) { final String clientId = _properties.getProperty("app.clientId"); final String tenantId = _properties.getProperty("app.tenantId"); final String clientSecret = _properties.getProperty("app.clientSecret"); _clientSecretCredential = new ClientSecretCredentialBuilder() .clientId(clientId) .tenantId(tenantId) .clientSecret(clientSecret) .build(); } if (_appClient == null) { _appClient = new GraphServiceClient(_clientSecretCredential, new String[] { "https://graph.microsoft.com/.default" }); } }
Remplacez la fonction vide
initializeGraph
dans App.java par ce qui suit.private static void initializeGraph(Properties properties) { try { Graph.initializeGraphForAppOnlyAuth(properties); } catch (Exception e) { System.out.println("Error initializing Graph for user auth"); System.out.println(e.getMessage()); } }
Ce code déclare deux propriétés privées, un ClientSecretCredential
objet et un GraphServiceClient
objet . La initializeGraphForAppOnlyAuth
fonction crée une instance de ClientSecretCredential
, puis utilise cette instance pour créer une nouvelle instance de GraphServiceClient
. Chaque fois qu’un appel d’API est effectué à Microsoft Graph via , _appClient
il utilise les informations d’identification fournies pour obtenir un jeton d’accès.
Tester clientSecretCredential
Ensuite, ajoutez du code pour obtenir un jeton d’accès à partir de .ClientSecretCredential
Ajoutez la fonction suivante à la classe
Graph
.public static String getAppOnlyToken() throws Exception { // Ensure credential isn't null if (_clientSecretCredential == null) { throw new Exception("Graph has not been initialized for app-only auth"); } // Request the .default scope as required by app-only auth final String[] graphScopes = new String[] {"https://graph.microsoft.com/.default"}; final TokenRequestContext context = new TokenRequestContext(); context.addScopes(graphScopes); final AccessToken token = _clientSecretCredential.getToken(context).block(); return token.getToken(); }
Remplacez la fonction vide
displayAccessToken
dans App.java par ce qui suit.private static void displayAccessToken() { try { final String accessToken = Graph.getAppOnlyToken(); System.out.println("Access token: " + accessToken); } catch (Exception e) { System.out.println("Error getting access token"); System.out.println(e.getMessage()); } }
Générez et exécutez l’application. Entrez
1
lorsque vous êtes invité à entrer une option. L’application affiche un jeton d’accès.Java App-Only Graph Tutorial Please choose one of the following options: 0. Exit 1. Display access token 2. List users 3. Make a Graph call 1 App-only token: eyJ0eXAiOiJKV1QiLCJub25jZSI6IlVDTzRYOWtKYlNLVjVkRzJGenJqd2xvVUcwWS...
Conseil
À des fins de validation et de débogage uniquement, vous pouvez décoder les jetons d’accès utilisateur (pour les comptes professionnels ou scolaires uniquement) à l’aide de l’analyseur de jetons en ligne de Microsoft à l’adresse https://jwt.ms. Cela peut être utile si vous rencontrez des erreurs de jeton lors de l’appel de Microsoft Graph. Par exemple, vérifier que la revendication dans le
scp
jeton contient les étendues d’autorisation Microsoft Graph attendues.
Répertorier des utilisateurs
Dans cette section, vous allez ajouter la possibilité de répertorier tous les utilisateurs de votre instance Azure Active Directory à l’aide de l’authentification d’application uniquement.
Ouvrez Graph.java et ajoutez la fonction suivante à la classe Graph .
public static UserCollectionResponse getUsers() throws Exception { // Ensure client isn't null if (_appClient == null) { throw new Exception("Graph has not been initialized for app-only auth"); } return _appClient.users().get(requestConfig -> { requestConfig.queryParameters.select = new String[] { "displayName", "id", "mail" }; requestConfig.queryParameters.top = 25; requestConfig.queryParameters.orderby = new String[] { "displayName" }; }); }
Remplacez la fonction vide
listUsers
dans App.java par ce qui suit.private static void listUsers() { try { final UserCollectionResponse users = Graph.getUsers(); // Output each user's details for (User user: users.getValue()) { System.out.println("User: " + user.getDisplayName()); System.out.println(" ID: " + user.getId()); System.out.println(" Email: " + user.getMail()); } final Boolean moreUsersAvailable = users.getOdataNextLink() != null; System.out.println("\nMore users available? " + moreUsersAvailable); } catch (Exception e) { System.out.println("Error getting users"); System.out.println(e.getMessage()); } }
Exécutez l’application, connectez-vous et choisissez l’option 4 pour répertorier les utilisateurs.
Please choose one of the following options: 0. Exit 1. Display access token 2. List users 3. Make a Graph call 2 User: Adele Vance ID: 05fb57bf-2653-4396-846d-2f210a91d9cf Email: AdeleV@contoso.com User: Alex Wilber ID: a36fe267-a437-4d24-b39e-7344774d606c Email: AlexW@contoso.com User: Allan Deyoung ID: 54cebbaa-2c56-47ec-b878-c8ff309746b0 Email: AllanD@contoso.com User: Bianca Pisani ID: 9a7dcbd0-72f0-48a9-a9fa-03cd46641d49 Email: NO EMAIL User: Brian Johnson (TAILSPIN) ID: a8989e40-be57-4c2e-bf0b-7cdc471e9cc4 Email: BrianJ@contoso.com ... More users available? True
Explication du code
Considérez le code dans la getUsers
fonction .
Accès à une collection
Cette méthode retourne une collection d’utilisateurs. La plupart des API de Microsoft Graph qui retournent une collection ne retournent pas tous les résultats disponibles dans une seule réponse. Au lieu de cela, ils utilisent la pagination pour retourner une partie des résultats tout en fournissant une méthode permettant aux clients de demander la « page » suivante.
Tailles de page par défaut
Les API qui utilisent la pagination implémentent une taille de page par défaut. Pour les utilisateurs, la valeur par défaut est 10. Les clients peuvent demander plus (ou moins) à l’aide du paramètre de requête $top . Dans getUsers
, cette opération s’effectue avec la top
propriété dans la configuration de la requête.
Remarque
La valeur définie dans top
est une limite supérieure, et non un nombre explicite. L’API retourne un nombre d’utilisateurs jusqu’à la valeur spécifiée.
Obtention des pages suivantes
Si d’autres résultats sont disponibles sur le serveur, les réponses de regroupement incluent une @odata.nextLink
propriété avec une URL d’API pour accéder à la page suivante. La bibliothèque de client Java expose cela en tant que méthode sur les getOdataNextLink
objets de réponse de collection. Si cette méthode retourne une valeur non null, d’autres résultats sont disponibles.
Tri des collections
La fonction utilise la orderBy
propriété sur la configuration de la demande pour demander des résultats triés par les noms complets des utilisateurs. Cela ajoute le paramètre de requête $orderby à l’appel d’API.
Facultatif : ajouter votre propre code
Dans cette section, vous allez ajouter vos propres fonctionnalités Microsoft Graph à l’application. Il peut s’agir d’un extrait de code de la documentation Microsoft Graph ou de l’Explorateur Graph, ou du code que vous avez créé. Cette section est facultative.
Mettre à jour l’application
Ouvrez Graph.java et ajoutez la fonction suivante à la classe Graph .
public static void makeGraphCall() { // INSERT YOUR CODE HERE }
Remplacez la fonction vide
MakeGraphCallAsync
dans App.java par ce qui suit.private static void makeGraphCall() { try { Graph.makeGraphCall(); } catch (Exception e) { System.out.println("Error making Graph call"); System.out.println(e.getMessage()); } }
Choisir une API
Recherchez une API dans Microsoft Graph que vous souhaitez essayer. Par exemple, l’API Créer un événement . Vous pouvez utiliser l’un des exemples de la documentation de l’API, ou vous pouvez personnaliser une demande d’API dans l’Explorateur Graph et utiliser l’extrait de code généré.
Configuration des autorisations
Consultez la section Autorisations de la documentation de référence de l’API choisie pour voir quelles méthodes d’authentification sont prises en charge. Certaines API ne prennent pas en charge les comptes Microsoft personnels ou d’application uniquement, par exemple.
- Pour appeler une API avec l’authentification utilisateur (si l’API prend en charge l’authentification utilisateur (déléguée), consultez le tutoriel sur l’authentification utilisateur (déléguée).
- Pour appeler une API avec l’authentification d’application uniquement (si l’API la prend en charge), ajoutez l’étendue d’autorisation requise dans le Centre d’administration Azure AD.
Ajouter votre code
Copiez votre code dans la makeGraphCallAsync
fonction dans Graph.java. Si vous copiez un extrait de code à partir de la documentation ou de l’Explorateur Graph, veillez à renommer en GraphServiceClient
_appClient
.
Félicitations !
Vous avez terminé le tutoriel Microsoft Graph java. Maintenant que vous disposez d’une application opérationnelle qui appelle Microsoft Graph, vous pouvez expérimenter et ajouter de nouvelles fonctionnalités.
- Découvrez comment utiliser l’authentification utilisateur (déléguée) avec le Kit de développement logiciel (SDK) Java Microsoft Graph.
- Consultez la vue d’ensemble de Microsoft Graph pour voir toutes les données accessibles avec Microsoft Graph.
Exemples Java
Vous avez un défi avec cette section ? Si c'est le cas, faites-nous part de vos commentaires pour que nous puissions l'améliorer.