Microsoft Graph‑utilityfuncties
Project maken in Azure Active Directory‑admincentrum
Er moet een project worden aangemaakt in het Azure Active Directory‑admincentrum voor een gebruiker met een MS‑Office‑account.
Stappen om een project te maken in het Azure Active Directory‑admincentrum
Hieronder vind je een stapsgewijze handleiding voor het maken van een project in het Azure Active Directory‑admincentrum.
1. Ga naar Azure Active Directory en log in met je MS‑Office‑creds.
Azure Active Directory link - https://aad.portal.azure.com/
2. Maak een Azure AD‑applicatie in je tenant.
Klik in het linker paneel op het label Azure Active Directory. Dit opent het blad voor Azure Active Directory. In dat scherm zie je een label App registrations. Dit is het startpunt voor het registreren van een Azure AD‑applicatie. Dit blad stelt je in staat een nieuwe applicatie voor Azure AD aan te maken.
Klik op de knop New registration om een nieuwe applicatie te maken.

3. Nu zie je het blad voor nieuwe applicatieregistratie.
- Naam Dit wordt de naam van je applicatie.
- Ondersteunde accounttypen Deze sectie zal de toegang beperken.
Klik op de knop Register.

4. Je zou het blad met nieuw geregistreerde applicaties moeten zien.
- Application (client) ID De ID van je applicatie.
- Directory (tenant) ID De Azure AD‑tenant‑ID.

5. Machtigingen toestaan voor de Microsoft Graph‑API.
Klik op het label API permissions.
Azure heeft je al User.Read delegated rechten gegeven voor je applicatie. Deze toestemming stelt ons in staat om gebruikersinformatie van een ingelogde gebruiker te lezen. Het zijn Microsoft Graph‑API‑rechten, die we ook Scopes noemen.
De volledige lijst met scopes voor de Microsoft Graph‑API - https://docs.microsoft.com/en-us/graph/permissions-reference.
Klik op de knop + Add a permission en selecteer Microsoft Graph.
Klik op Delegated permissions. Nu zie je een lijst met rechten die beschikbaar zijn voor de Microsoft Graph‑API.
Selecteer de vereiste rechten, klik op de knop Add permissions.
Klik op de knop Grant admin consent.

6. Sta publieke client‑stromen toe.
Geeft aan of de applicatie een publieke client is. Geschikt voor apps die token‑grant‑stromen gebruiken die geen omleidings‑URI gebruiken.

7. Maak een sleutel voor de applicatie

Helperklassen
De volgende hulpprogrammaklassen zijn vereist om de code in deze sectie uit te voeren. Deze klassen dienen alleen ter vereenvoudiging van de demonstratie.
AzureROPCTokenProvider‑klasse
Een instantie van de IGraphClient klasse verwerkt het opbouwen van verzoeken, het verzenden ervan naar de Microsoft Graph‑API en het verwerken van de antwoorden. Om een nieuwe instantie van deze klasse te maken, moet je een instantie van leveren ITokenProvider, die verzoeken naar Microsoft Graph kan authenticeren.
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();
}
}