Fonctionnalités utilitaires de Microsoft Graph
Création d’un projet dans le centre d’administration Azure Active Directory
Un projet doit être créé dans le centre d’administration Azure Active Directory pour un utilisateur disposant d’un compte MS Office.
Étapes pour créer un projet dans le centre d’administration Azure Active Directory
Voici un tutoriel étape par étape pour créer un projet dans le centre d’administration Azure Active Directory.
1. Accédez à Azure Active Directory et connectez-vous avec vos identifiants MS Office.
Azure Active Directory Lien - https://aad.portal.azure.com/
2. Créez une application Azure AD dans votre locataire.
Dans le panneau latéral gauche, cliquez sur le libellé Azure Active Directory. Cela ouvrira le volet pour Azure Active Directory. Sur cet écran, vous devriez voir le libellé App registrations. C’est le point de départ de l’enregistrement d’une application Azure AD. Ce volet vous permettra de créer une nouvelle application pour Azure AD.
Cliquez sur le bouton New registration pour créer une nouvelle application.

3. Vous verrez maintenant le nouveau volet d’enregistrement d’application.
- Name Ce sera le nom de votre application.
- Supported account types Cette section limitera l’accès.
Cliquez sur le bouton Register.

4. Vous devriez voir le volet des applications nouvellement enregistrées.
- Application (client) ID L’ID de votre application.
- Directory (tenant) ID L’ID du locataire Azure AD.

5. Autorisation des autorisations pour l’API Microsoft Graph.
Cliquez sur le libellé API permissions.
Azure vous a déjà accordé les autorisations déléguées User.Read pour votre application. Cette autorisation nous permettra de lire les informations utilisateur pour un utilisateur connecté. Ce sont des autorisations de l’API Microsoft Graph, que l’on peut également appeler Scopes.
La liste complète des scopes pour l’API Microsoft Graph - https://docs.microsoft.com/en-us/graph/permissions-reference.
Cliquez sur le bouton + Add a permission et sélectionnez Microsoft Graph.
Cliquez sur Delegated permissions. Vous voyez maintenant une liste d’autorisations disponibles pour l’API Microsoft Graph.
Sélectionnez les autorisations requises, cliquez sur le bouton Add permissions.
Cliquez sur le bouton Grant admin consent.

6. Autoriser les flux de client public.
Spécifie si l’application est un client public. Approprié pour les applications utilisant des flux d’octroi de jeton qui n’utilisent pas d’URI de redirection.

7. Créer une clé pour l’application

Classes d’assistance
Les classes d’assistance suivantes sont requises pour exécuter les codes dans cette section. Ces classes sont uniquement pour simplifier la démonstration.
Classe AzureROPCTokenProvider
Une instance du IGraphClient la classe gère la construction des requêtes, leur envoi à l’API Microsoft Graph et le traitement des réponses. Pour créer une nouvelle instance de cette classe, vous devez fournir une instance de ITokenProvider, qui peut authentifier les requêtes vers Microsoft Graph.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
* Azure resource owner password credential (ROPC) token provider
* https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth-ropc
* https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-authenticate-an-ews-application-by-using-oauth
* https://portal.azure.com
* https://developer.microsoft.com/en-us/graph/graph-explorer/#
* token parser https://jwt.io
* </p>
*/
class AzureROPCTokenProvider implements ITokenProvider {
private static final String GRANT_TYPE = "password";
private final String clientId;
private final String clientSecret;
private final String userName;
private final String password;
private final String tenant;
private final String scope;
private OAuthToken token;
public AzureROPCTokenProvider(String tenant, String clientId, String clientSecret,
String userName, String password, String[] scopeAr) {
this.tenant = tenant;
this.clientId = clientId;
this.clientSecret = clientSecret;
this.userName = userName;
this.password = password;
this.scope = joinToStr(scopeAr, " ");
}
public synchronized OAuthToken getAccessToken(boolean ignoreExistingToken) {
if (this.token != null && !this.token.getExpired() && !ignoreExistingToken)
return this.token;
token = null;
Map<String, String> tokenArgs = geToken();
java.util.Calendar c = java.util.Calendar.getInstance();
c.add(java.util.Calendar.SECOND, Integer.parseInt(tokenArgs.get("expires_in")));
token = new OAuthToken(tokenArgs.get("access_token"), TokenType.AccessToken, c.getTime());
return token;
}
public final OAuthToken getAccessToken() {
return getAccessToken(false);
}
public void dispose() {
}
private String getEncodedParameters() {
return "client_id=" + urlEncode(clientId) + "&scope=" + urlEncode(scope) + "&username=" + urlEncode(userName)
+ "&password=" + urlEncode(password) + "&grant_type="
+ urlEncode(GRANT_TYPE);
}
private String getUri() {
if (tenant == null || tenant.trim().isEmpty())
return "https://login.microsoftonline.com/common/oauth2/v2.0/token";
else
return "https://login.microsoftonline.com/" + tenant + "/oauth2/v2.0/token";
}
private Map<String, String> geToken() {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(getUri()).openConnection();
connection.setRequestMethod("POST");
byte[] requestData = getEncodedParameters().getBytes(StandardCharsets.UTF_8);
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", "" + requestData.length);
final OutputStream st = connection.getOutputStream();
try {
st.write(requestData, 0, requestData.length);
} finally {
st.flush();
st.close();
}
connection.connect();
if (connection.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) {
throw new IllegalAccessError("Operation failed: " + connection.getResponseCode() + "/" +
connection.getResponseMessage() + "\r\nDetails:\r\n{2}"
+ readInputStream(connection.getErrorStream()));
}
String responseText = readInputStream(connection.getInputStream());
Map<String, String> result = new HashMap<>();
String[] fromJsonToKeyValue = responseText.replace("{", "").replace("}", "")
.replace("\"", "").replace("\r", "")
.replace("\n", "").split(",");
for (String keyValue : fromJsonToKeyValue) {
String[] pair = keyValue.split(":");
String name = pair[0].trim().toLowerCase();
String value = urlDecode(pair[1].trim());
result.put(name, value);
}
return result;
} catch (IOException e) {
throw new IllegalAccessError(e.getMessage());
}
}
static String urlEncode(String value) {
try {
return URLEncoder.encode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
throw new IllegalAccessError(e.getMessage());
}
}
static String urlDecode(String value) {
try {
return URLDecoder.decode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
throw new IllegalAccessError(e.getMessage());
}
}
static String readInputStream(InputStream is) {
if (is == null)
return "";
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder result = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
result.append(line);
}
} catch (IOException e) {
// ignore
}
return result.toString();
}
static String joinToStr(String[] arr, String sep) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
if (i > 0)
sb.append(sep);
sb.append(arr[i]);
}
return sb.toString();
}
}