Erstellen von Java-Apps mit Microsoft Graph und nur app-Authentifizierung
In diesem Tutorial erfahren Sie, wie Sie eine Java-Konsolen-App erstellen, die die Microsoft Graph-API verwendet, um mithilfe der reinen App-Authentifizierung auf Daten zuzugreifen. Die reine App-Authentifizierung ist eine gute Wahl für Hintergrunddienste oder Anwendungen, die auf Daten für alle Benutzer in einer Organisation zugreifen müssen.
Hinweis
Informationen zur Verwendung von Microsoft Graph zum Zugreifen auf Daten im Namen eines Benutzers finden Sie in diesem Tutorial zur (delegierten) Benutzerauthentifizierung.
In diesem Lernprogramm wird Folgendes vermittelt:
Tipp
Alternativ zur Durchführung dieses Tutorials können Sie das GitHub-Repository herunterladen oder klonen und den Anweisungen in der INFODATEI folgen, um eine Anwendung zu registrieren und das Projekt zu konfigurieren.
Voraussetzungen
Bevor Sie mit diesem Tutorial beginnen, sollten Das Java SE Development Kit (JDK) und Gradle auf Ihrem Entwicklungscomputer installiert sein.
Sie sollten auch über ein Microsoft-Geschäfts-, Schul- oder Unikonto mit der Rolle "Globaler Administrator" verfügen. Wenn Sie nicht über einen Microsoft 365-Mandanten verfügen, können Sie sich über das Microsoft 365-Entwicklerprogramm für einen mandantenfähigen Mandanten qualifizieren. Weitere Informationen finden Sie in den häufig gestellten Fragen. Alternativ können Sie sich für eine kostenlose 1-monatige Testversion registrieren oder einen Microsoft 365-Plan erwerben.
Hinweis
Dieses Tutorial wurde mit OpenJDK Version 17.0.2 und Gradle 7.4.2 geschrieben. Die Schritte in diesem Leitfaden funktionieren möglicherweise mit anderen Versionen, die jedoch nicht getestet wurden.
Registrieren der App im Portal
In dieser Übung registrieren Sie eine neue Anwendung in Azure Active Directory, um die reine App-Authentifizierung zu aktivieren. Sie können eine Anwendung über das Microsoft Entra Admin Center oder mithilfe des Microsoft Graph PowerShell SDK registrieren.
Registrieren der Anwendung für die reine App-Authentifizierung
In diesem Abschnitt registrieren Sie eine Anwendung, die die reine App-Authentifizierung mit Clientanmeldeinformationen unterstützt.
Öffnen Sie einen Browser, navigieren Sie zum Microsoft Entra Admin Center , und melden Sie sich mit einem globalen Administratorkonto an.
Wählen Sie im linken Navigationsbereich Microsoft Entra ID aus, erweitern Sie Identität, erweitern Sie Anwendungen, und wählen Sie dann App-Registrierungen aus.
Wählen Sie Neue Registrierung aus. Geben Sie einen Namen für Ihre Anwendung ein,
Graph App-Only Auth Tutorial
z. B. .Legen Sie Unterstützte Kontotypen auf Nur Konten in diesem Organisationsverzeichnis fest.
Lassen Sie URI umleiten leer.
Wählen Sie Registrieren aus. Kopieren Sie auf der Seite Übersicht der Anwendung den Wert der Anwendungs-ID (Client) und der Verzeichnis-ID (Mandanten-ID), und speichern Sie sie. Diese Werte benötigen Sie im nächsten Schritt.
Wählen Sie API-Berechtigungen unter Verwalten aus.
Entfernen Sie die Standardberechtigung User.Read unter Konfigurierte Berechtigungen , indem Sie die Auslassungspunkte (...) in der Zeile auswählen und Berechtigung entfernen auswählen.
Wählen Sie Berechtigung hinzufügen und dann Microsoft Graph aus.
Wählen Sie Anwendungsberechtigungen aus.
Wählen Sie User.Read.All und dann Berechtigungen hinzufügen aus.
Wählen Sie Administratoreinwilligung erteilen für... und dann Ja aus, um die Administratoreinwilligung für die ausgewählte Berechtigung bereitzustellen.
Wählen Sie zertifikate und geheimnisse unter Verwalten und dann Neuer geheimer Clientschlüssel aus.
Geben Sie eine Beschreibung ein, wählen Sie eine Dauer aus, und wählen Sie Hinzufügen aus.
Kopieren Sie das Geheimnis aus der Spalte Wert . Sie benötigen es in den nächsten Schritten.
Wichtig
Dieser geheime Clientschlüssel wird nicht noch einmal angezeigt, stellen Sie daher sicher, dass Sie ihn jetzt kopieren.
Hinweis
Beachten Sie, dass Sie im Gegensatz zu den Schritten bei der Registrierung für die Benutzerauthentifizierung in diesem Abschnitt Microsoft Graph-Berechtigungen für die App-Registrierung konfiguriert haben. Dies liegt daran, dass die reine App-Authentifizierung den Clientanmeldeinformationsflow verwendet, der erfordert, dass Berechtigungen für die App-Registrierung konfiguriert werden. Ausführliche Informationen finden Sie unter .default-Bereich .
Erstellen einer Java-Konsolen-App
In diesem Abschnitt erstellen Sie eine einfache Java-Konsolen-App.
Öffnen Sie Ihre Befehlszeilenschnittstelle (CLI) in einem Verzeichnis, in dem Sie das Projekt erstellen möchten. Führen Sie den folgenden Befehl aus, um ein neues Gradle-Projekt zu erstellen.
gradle init --dsl groovy --test-framework junit --type java-application --project-name graphapponlytutorial --package graphapponlytutorial
Nachdem das Projekt erstellt wurde, überprüfen Sie, ob es funktioniert, indem Sie den folgenden Befehl ausführen, um die App in Ihrer CLI auszuführen.
./gradlew --console plain run
Wenn es funktioniert, sollte die App ausgeben
Hello World.
.
Installieren von Abhängigkeiten
Bevor Sie mit dem Vorgang fortfahren, fügen Sie einige zusätzliche Abhängigkeiten hinzu, die Sie später verwenden werden.
- Azure Identity-Clientbibliothek für Java zum Authentifizieren des Benutzers und Abrufen von Zugriffstoken.
- Microsoft Graph SDK für Java , um Aufrufe an Microsoft Graph zu senden.
Öffnen Sie ./app/build.gradle. Aktualisieren Sie den
dependencies
Abschnitt, um diese Abhängigkeiten hinzuzufügen.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' }
Fügen Sie Am Ende von ./app/build.gradle Folgendes hinzu.
run { standardInput = System.in }
Wenn Sie das nächste Mal das Projekt erstellen, lädt Gradle diese Abhängigkeiten herunter.
Laden von Anwendungseinstellungen
In diesem Abschnitt fügen Sie dem Projekt die Details Ihrer App-Registrierung hinzu.
Erstellen Sie im Verzeichnis ./app/src/main/resources ein neues Verzeichnis mit dem Namen graphapponlytutorial.
Erstellen Sie im Verzeichnis ./app/src/main/resources/graphapponlytutorial eine neue Datei mit dem Namen oAuth.properties, und fügen Sie der Datei den folgenden Text hinzu.
app.clientId=YOUR_CLIENT_ID_HERE app.clientSecret=YOUR_CLIENT_SECRET_HERE app.tenantId=YOUR_TENANT_ID_HERE
Aktualisieren Sie die Werte gemäß der folgenden Tabelle.
Einstellung Wert app.clientId
Die Client-ID Ihrer App-Registrierung app.tenantId
Die Mandanten-ID Ihrer Organisation app.clientSecret
Der geheime Clientschlüssel Wichtig
Wenn Sie quellcodeverwaltung wie Git verwenden, wäre es jetzt ein guter Zeitpunkt, die oAuth.properties-Datei aus der Quellcodeverwaltung auszuschließen, um zu vermeiden, dass Ihre App-ID versehentlich kompromittiert wird.
Entwerfen der App
In diesem Abschnitt erstellen Sie ein einfaches konsolenbasiertes Menü.
Öffnen Sie ./app/src/main/java/graphapponlytutorial/App.java , und fügen Sie die folgenden
import
Anweisungen hinzu.package graphapponlytutorial; import java.io.IOException; import java.util.InputMismatchException; import java.util.Properties; import java.util.Scanner; import com.microsoft.graph.models.User;
Ersetzen Sie die vorhandene
main
-Funktion durch Folgendes.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(); }
Fügen Sie am Ende der Datei die folgenden Platzhaltermethoden hinzu. Sie implementieren sie in späteren Schritten.
private static void initializeGraph(Properties properties) { // TODO } private static void displayAccessToken() { // TODO } private static void listUsers() { // TODO } private static void makeGraphCall() { // TODO }
Dadurch wird ein einfaches Menü implementiert und die Auswahl des Benutzers aus der Befehlszeile gelesen.
- Löschen Sie ./app/src/test/java/graphapponlytutorial/AppTest.java.
Hinzufügen einer reinen App-Authentifizierung
In diesem Abschnitt fügen Sie der Anwendung die reine App-Authentifizierung hinzu. Dies ist erforderlich, um das erforderliche OAuth-Zugriffstoken zum Aufrufen von Microsoft Graph abzurufen. In diesem Schritt integrieren Sie die Azure Identity-Clientbibliothek für Java in die Anwendung und konfigurieren die Authentifizierung für das Microsoft Graph SDK für Java.
Konfigurieren des Graph-Clients für die reine App-Authentifizierung
In diesem Abschnitt verwenden Sie die ClientSecretCredential
-Klasse, um mithilfe des Clientanmeldeinformationsflows ein Zugriffstoken anzufordern.
Erstellen Sie im Verzeichnis ./app/src/main/java/graphapponlytutorial eine neue Datei mit dem Namen Graph.java , und fügen Sie der Datei den folgenden Code hinzu.
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;
Fügen Sie eine leere Graph-Klassendefinition hinzu.
public class Graph { }
Fügen Sie der Graph-Klasse den folgenden Code hinzu.
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" }); } }
Ersetzen Sie die leere
initializeGraph
Funktion in App.java durch Folgendes.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()); } }
Dieser Code deklariert zwei private Eigenschaften, ein ClientSecretCredential
-Objekt und ein GraphServiceClient
-Objekt. Die initializeGraphForAppOnlyAuth
-Funktion erstellt eine neue Instanz von ClientSecretCredential
und verwendet diese Instanz dann, um eine neue Instanz von GraphServiceClient
zu erstellen. Jedes Mal, wenn ein API-Aufruf an Microsoft Graph über _appClient
erfolgt, werden die bereitgestellten Anmeldeinformationen verwendet, um ein Zugriffstoken abzurufen.
Testen von ClientSecretCredential
Fügen Sie als Nächstes Code hinzu, um ein Zugriffstoken ClientSecretCredential
von abzurufen.
Fügen Sie die folgende Funktion zur
Graph
-Klasse hinzu: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(); }
Ersetzen Sie die leere
displayAccessToken
Funktion in App.java durch Folgendes.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()); } }
Erstellen Sie die App, und führen Sie sie aus. Geben Sie ein
1
, wenn Sie zur Eingabe einer Option aufgefordert werden. Die Anwendung zeigt ein Zugriffstoken an.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...
Tipp
Nur zu Validierungs- und Debugzwecken können Sie Benutzerzugriffstoken (nur für Geschäfts-, Schul- oder Unikonten) decodieren, indem Sie den Onlinetokenparser von Microsoft unter verwendenhttps://jwt.ms. Dies kann nützlich sein, wenn beim Aufrufen von Microsoft Graph Tokenfehler auftreten. Beispielsweise wird überprüft, ob der
scp
Anspruch im Token die erwarteten Microsoft Graph-Berechtigungsbereiche enthält.
Benutzer auflisten
In diesem Abschnitt fügen Sie die Möglichkeit hinzu, alle Benutzer in Ihrer Azure Active Directory-Instanz mithilfe der reinen App-Authentifizierung aufzulisten.
Öffnen Sie Graph.java , und fügen Sie der Graph-Klasse die folgende Funktion hinzu.
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" }; }); }
Ersetzen Sie die leere
listUsers
Funktion in App.java durch Folgendes.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()); } }
Führen Sie die App aus, melden Sie sich an, und wählen Sie Option 4 aus, um Benutzer aufzulisten.
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
Code erläutert
Betrachten Sie den Code in der getUsers
Funktion.
Zugreifen auf eine Sammlung
Diese Methode gibt eine Auflistung von Benutzern zurück. Die meisten APIs in Microsoft Graph, die eine Sammlung zurückgeben, geben nicht alle verfügbaren Ergebnisse in einer einzigen Antwort zurück. Stattdessen wird paging verwendet, um einen Teil der Ergebnisse zurückzugeben, während clients eine Methode zum Anfordern der nächsten "Seite" bereitstellen.
Standardseitengrößen
APIs, die Paging verwenden, implementieren eine Standardseitengröße. Für Benutzer ist der Standardwert 10. Clients können mithilfe des abfrageparameters $top mehr (oder weniger) anfordern. In getUsers
wird dies mit der top
-Eigenschaft in der Anforderungskonfiguration erreicht.
Hinweis
Der in top
festgelegte Wert ist eine obere Grenze, keine explizite Zahl. Die API gibt eine Anzahl von Benutzern bis zum angegebenen Wert zurück.
Abrufen nachfolgender Seiten
Wenn auf dem Server weitere Ergebnisse verfügbar sind, enthalten Sammlungsantworten eine @odata.nextLink
Eigenschaft mit einer API-URL für den Zugriff auf die nächste Seite. Die Java-Clientbibliothek macht dies als Methode getOdataNextLink
für Sammlungsantwortobjekte verfügbar. Wenn diese Methode ungleich NULL zurückgibt, stehen weitere Ergebnisse zur Verfügung.
Sortieren von Sammlungen
Die Funktion verwendet die orderBy
-Eigenschaft für die Anforderungskonfiguration, um Ergebnisse anzufordern, die nach den Anzeigenamen der Benutzer sortiert sind. Dadurch wird dem API-Aufruf der abfrageparameter $orderby hinzugefügt.
Optional: Fügen Sie Ihren eigenen Code hinzu.
In diesem Abschnitt fügen Sie der Anwendung Ihre eigenen Microsoft Graph-Funktionen hinzu. Dies kann ein Codeausschnitt aus der Microsoft Graph-Dokumentation oder graph-Explorer oder code sein, den Sie erstellt haben. Dieser Abschnitt ist optional.
Aktualisieren der App
Öffnen Sie Graph.java , und fügen Sie der Graph-Klasse die folgende Funktion hinzu.
public static void makeGraphCall() { // INSERT YOUR CODE HERE }
Ersetzen Sie die leere
MakeGraphCallAsync
Funktion in App.java durch Folgendes.private static void makeGraphCall() { try { Graph.makeGraphCall(); } catch (Exception e) { System.out.println("Error making Graph call"); System.out.println(e.getMessage()); } }
Auswählen einer API
Suchen Sie eine API in Microsoft Graph, die Sie ausprobieren möchten. Beispiel: Die Api zum Erstellen eines Ereignisses . Sie können eines der Beispiele in der API-Dokumentation verwenden, oder Sie können eine API-Anforderung im Graph-Explorer anpassen und den generierten Codeausschnitt verwenden.
Konfigurieren von Berechtigungen
Überprüfen Sie den Abschnitt Berechtigungen der Referenzdokumentation für Die ausgewählte API, um zu sehen, welche Authentifizierungsmethoden unterstützt werden. Einige APIs unterstützen z. B. keine reinen Apps oder persönlichen Microsoft-Konten.
- Informationen zum Aufrufen einer API mit Benutzerauthentifizierung (wenn die API die (delegierte) Benutzerauthentifizierung unterstützt), finden Sie im Tutorial zur benutzerseitig (delegierten) Authentifizierung .
- Um eine API mit nur app-Authentifizierung aufzurufen (sofern die API dies unterstützt), fügen Sie den erforderlichen Berechtigungsbereich im Azure AD Admin Center hinzu.
Fügen Sie Ihren Code hinzu
Kopieren Sie Ihren Code in die makeGraphCallAsync
Funktion in Graph.java. Wenn Sie einen Codeausschnitt aus der Dokumentation oder dem Graph-Explorer kopieren, müssen Sie den GraphServiceClient
_appClient
in umbenennen.
Herzlichen Glückwunsch!
Sie haben das Java Microsoft Graph-Tutorial abgeschlossen. Nachdem Sie nun über eine funktionierende App verfügen, die Microsoft Graph aufruft, können Sie experimentieren und neue Features hinzufügen.
- Erfahren Sie, wie Sie die (delegierte) Benutzerauthentifizierung mit dem Microsoft Graph Java SDK verwenden.
- Besuchen Sie die Übersicht über Microsoft Graph , um alle Daten anzuzeigen, auf die Sie mit Microsoft Graph zugreifen können.
Java-Beispiele
Liegt ein Problem mit diesem Abschnitt vor? Wenn ja, senden Sie uns Feedback, damit wir den Abschnitt verbessern können.