Utiliser Microsoft Graph avec Java standard

Microsoft Graph avec package Java standard

Ce serait bien d'utiliser le SDK Microsoft pour Java, mais cela nécessite beaucoup de fichiers Jar associés. Pour comprendre ce que vous faites en substance, écrivons une requête Microsoft Graph avec uniquement le package Java standard.

Que faire

  1. Enregistrez l'application dans Azure AD et créez un ID client et un secret (la procédure est Tutorial. référence)
  2. Obtenez un jeton d'accès d'Azure AD avec OAuth2. Il sera retourné en JSON.
  3. Contactez le point de terminaison API Microsoft Graph. JSON est renvoyé. seulement.

Si vous l'écrivez avec la commande Curl pour le moment, ce sera comme ça

Obtenez un jeton d'accès.

Tout d'abord, obtenez un jeton d'accès auprès d'Azure Active Directory conformément à la procédure OAuth. L'URL (point de terminaison) à obtenir est

** https://login.microsoftonline.com/tenant ID / oauth2 / v2.0 / token **

L'ID de locataire se trouve dans la vue d'ensemble du locataire Azure AD. POSTER l'ID client et le secret créés vers ici. Étant donné que l'étendue échappe l'URL, il s'agit de% 3A ou% 2F. Pour plus de détails sur ce qui peut être spécifié, cliquez ici [https://docs.microsoft.com/ja-jp/azure/active-directory/develop/v2-permissions-and-consent). grant_type est un paramètre OAuth avec une valeur fixe.

curl -d "client_id=identité du client" \
 -d "scope=https%3A%2F%2Fgraph.microsoft.com%2F.default" \
 -d "client_secret=Secret du client" \
 -d "grant_type=client_credentials" \
 -H "Content-Type: application/x-www-form-urlencoded" \
 -X POST https://login.microsoftonline.com/ID du locataire/oauth2/v2.0/token

Vous pouvez obtenir un jeton d'accès. image.png

Contactez l'API Microsoft Graph à l'aide d'un jeton d'accès

Copiez le jeton d'accès précédent, puis interrogez et manipulez l'API Microsoft Graph. Par exemple, si vous souhaitez obtenir un membre du groupe, cela ressemblera à ceci. Cliquez ici pour le point final.

https://graph.microsoft.com/v1.0/groups/{group-id}/members

Utilisez Graph Explorer pour vérifier l'emplacement du point de terminaison et le format. Bien que omis, l'ID de groupe est obtenu en se connectant à Azure AD et en obtenant l'ID affiché dans la liste «Tous les groupes» à l'avance.

curl -H GET 'https://graph.microsoft.com/v1.0/groups/ID de groupe/members'\
 -H 'Content-Type: application/json;charset=utf-8'\
 -H 'Authorization:Jeton d'accès au porteur'

J'ai omis la capture d'écran résultante, mais vous pouvez voir que les valeurs sont renvoyées au format JSON. image.png

Si vous écrivez ce processus HTTP en Java

Cette fois, il est écrit en Java 8. De plus, la gestion des erreurs est omise. Si le réseau est sous un proxy, définissez le proxy dans la variable d'environnement Java.

App.java


import java.io.*;
import java.net.*;

//Bien que l'on dise qu'il s'agit d'un package standard, j'ai utilisé la bibliothèque supplémentaire javax uniquement ici.
//Il décode également les caractères échappés Unicode
//Cliquez ici pour le fichier Jar
//https://repo1.maven.org/maven2/org/glassfish/javax.json/1.1.4/javax.json-1.1.4.jar
import javax.json.*;

public class App {

	public static void main(String[] args) throws Exception {
		
		String tenant_id = "ID du locataire";
		String client_id = "identité du client";
		String client_secret = "Secret du client";
		String group_id = "ID de groupe";
		
		HttpURLConnection conn = null;
		InputStream input = null;
		HttpURLConnection conn2 = null;
		InputStream input2 = null;
		try {
			//①
			//Obtenez un jeton d'accès avec Oauth2
			
			//Traitement des requêtes HTTP standard Java
			URL url = new URL("https://login.microsoftonline.com/" + tenant_id + "/oauth2/v2.0/token");
			conn = (HttpURLConnection) url.openConnection();
			conn.setConnectTimeout(5000);//Temps requis pour la connexion en milliseconde
			conn.setReadTimeout(5000);//Temps requis pour lire les données en milliseconde
			conn.setRequestMethod("POST");//Méthode HTTP
			conn.setUseCaches(false);//Utilisation du cache
			conn.setDoOutput(true);//Autoriser l'envoi du corps de la demande(Faux pour GET,Défini sur true pour POST)
			conn.setDoInput(true);//Autoriser la réception du corps de la réponse
			conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			String data = //Données à publier
				  "client_id=" + client_id
				+ "&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default"  //java.net.Peut être échappé avec URLEncoder
				+ "&client_secret=" + client_secret
				+ "&grant_type=client_credentials";
			conn.getOutputStream().write(data.getBytes("utf-8"));
			conn.getOutputStream().close(); // send
			
			//Recevez le résultat et convertissez-le en objet Json
			//Si vous n'utilisez pas la bibliothèque JSON, analysez simplement le texte renvoyé par vous-même
			//J'obtiens quelque chose de similaire à la corde que j'obtenais avec Curl
			int code = conn.getResponseCode();
			input = (code == 200 ? conn.getInputStream() : conn.getErrorStream());
			JsonReader jsonReader = Json.createReader(new BufferedReader(new InputStreamReader(input, "utf-8")));
			JsonObject json = jsonReader.readObject();
			jsonReader.close();
			conn.disconnect();
			
			//J'ai le jeton d'accès!
			String access_token = json.getString("access_token");
			
			
			//②
			//Ensuite, contactez l'API Microsoft Graph pour les membres du groupe
			URL url2 = new URL("https://graph.microsoft.com/v1.0/groups/" + group_id + "/members");
			conn2 = (HttpURLConnection) url2.openConnection();
			conn2.setConnectTimeout(5000);//Temps requis pour la connexion en milliseconde
			conn2.setReadTimeout(5000);//Temps requis pour lire les données en milliseconde
			conn2.setRequestMethod("GET");
			conn2.setUseCaches(false);//Utilisation du cache
			conn2.setDoOutput(false);//Autoriser l'envoi du corps de la demande(Faux pour GET,Défini sur true pour POST)
			conn2.setDoInput(true);//Autoriser la réception du corps de la réponse
			conn2.setRequestProperty("Authorization", "Bearer " + access_token); //Jeton d'accès obtenu
			conn2.setRequestProperty("Accept", "application/json"); //C'est important! !! !! Le point auquel j'étais accro
			conn2.connect();
		
			int code2 = conn2.getResponseCode();
			input2 = (code2 == 200 ? conn2.getInputStream() : conn2.getErrorStream());
			JsonReader jsonReader2 = Json.createReader(new BufferedReader(new InputStreamReader(input2, "utf-8")));
			JsonStructure json2 = jsonReader2.read();
			jsonReader2.close();
			conn2.disconnect();
		
			JsonArray members = json2.asJsonObject().getJsonArray("value");
			
			//J'ai un membre du groupe!
			System.out.println(members);
		}
		catch(Error e) {
			e.printStackTrace();
		}
		finally {
			if(input != null) try { input.close(); } catch(Exception e){}
			if(conn != null) try { conn.disconnect(); } catch(Exception e){}
			if(input2 != null) try { input2.close(); } catch(Exception e){}
			if(conn2 != null) try { conn2.disconnect(); } catch(Exception e){}
		}
	}
}

Je l'ai bien compris lorsque je l'ai compilé et exécuté. image.png

Résumé

Vous pouvez l'obtenir simplement sans utiliser le SDK, vous n'avez pas besoin de plusieurs fichiers Jar supplémentaires et la procédure avec le serveur n'est pas masquée, vous pouvez donc en saisir l'essence. D'un autre côté, si vous utilisez le SDK, vous pouvez vous concentrer sur le codage sans être conscient de l'expiration du jeton ou de l'URL du point de terminaison, et Graph Explorer produira un extrait de code, donc je pense que la productivité augmentera.

Recommended Posts

Utiliser Microsoft Graph avec Java standard
Utiliser des couches Lambda avec Java
Utiliser SpatiaLite avec Java / JDBC
Utiliser java avec MSYS et Cygwin
Utiliser Azure Bing SpellCheck avec Java
Utilisez JDBC avec Java et Scala.
Utiliser Java 11 avec Google Cloud Functions
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
[JaCoCo (Java Code Coverage)] Utilisation avec NetBeans
Enregistreur standard Java
[Java] Utilisez Collectors.collectingAndThen
Comment utiliser le framework Java avec AWS Lambda! ??
Je veux utiliser java8 forEach avec index
Comment utiliser l'API Java avec des expressions lambda
Utilisez Matplotlib depuis Java ou Scala avec Matplotlib4j
[JAVA] [Spring] [MyBatis] Utiliser IN () avec SQL Builder
Créer un graphique simple avec Rails Utiliser gem-chartkick / groupdate
Installez java avec Homebrew
Utilisez Fast Mapping Livery MapStruct avec Lombok et Java 11
Utiliser ProGuard avec Gradle
Changer de siège avec Java
interface de type de fonction standard java
[Java] Comment chiffrer avec le chiffrement AES avec une bibliothèque standard
Utiliser Puphpeteer avec Docker
Utiliser la requête agrégée (nombre) avec le SDK Java Azure CosmosDB
Téléchargement confortable avec JAVA
Utilisez XVim2 avec Xcode 12.0.1
Utilisation de CentOS avec LXD
Jouez avec les nœuds de fonction Java qui peuvent utiliser Java avec Node-RED
Créer des graphiques avec JFreeChart
Accédez à la requête graphique avec Java + PGX à une vitesse explosive
Changer java avec direnv
Utiliser OpenCV avec Java
Utiliser Webmock avec Rspec
Téléchargement Java avec Ansible
Raclons avec Java! !!
Utilisez java1.7 (zulu7) dans un répertoire spécifique avec jenv
Utiliser les WebJars avec Gradle
Construire Java avec Wercker
Utiliser PreparedStatement en Java
Utilisez jlink avec gradle
Conversion Endian avec JAVA
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
Comment utiliser le modèle entraîné Tensorflow 2.0 avec Kotlin / Java
Utilisez Java inclus avec Android Studio pour créer React Native
[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit
(Java) BDD facile avec Spectrum?
Créer un multi-projet Java avec Gradle
Premiers pas avec Java Collection
Utiliser GDAL avec Python avec Docker
Sous-chaîne de mémo Java (classe standard)
Configuration Java avec Spring MVC
[Java] Comment utiliser Map
Authentification de base avec Java 11 HttpClient
Expérimentons l'expansion en ligne Java
Exécuter un lot avec docker-compose avec Java batch
Réécrire Java try-catch avec facultatif
Installez Java 7 avec Homebrew (cask)