Funzionalità Utilità Microsoft Graph
Creazione di un Progetto in Azure Active Directory Admin Center
Un progetto deve essere creato nel centro di amministrazione di Azure Active Directory per un utente con account MS Office.
Passi per Creare un Progetto in Azure Active Directory Admin Center
Di seguito trovi un tutorial passo passo per creare un progetto nel centro di amministrazione di Azure Active Directory.
1. Vai a Azure Active Directory e accedi usando le tue credenziali MS Office.
Azure Active Directory Link - https://aad.portal.azure.com/
2. Crea un’Applicazione Azure AD nel tuo tenant.
Nel pannello laterale sinistro fai clic sull’etichetta Azure Active Directory. Questo aprirà il pannello per Azure Active Directory. In quella schermata dovresti vedere l’etichetta App registrations. Questo è il punto di partenza per la registrazione di un’Applicazione Azure AD. Questo pannello ti consentirà di creare una nuova applicazione per Azure AD.
Fai clic sul pulsante New registration per creare una nuova applicazione.

3. Ora vedrai il nuovo pannello di registrazione dell’applicazione.
- Name Questo sarà il nome della tua applicazione.
- Supported account types Questa sezione limiterà l’accesso.
Fai clic sul pulsante Register.

4. Dovresti vedere il pannello delle applicazioni appena registrate.
- Application (client) ID L’ID della tua applicazione.
- Directory (tenant) ID L’ID del tenant Azure AD.

5. Concessione delle autorizzazioni per l’API Microsoft Graph.
Fai clic sull’etichetta API permissions.
Azure ti ha già fornito le autorizzazioni delegate User.Read per la tua applicazione. Questa autorizzazione ci permetterà di leggere le informazioni dell’utente connesso. Queste sono autorizzazioni dell’API Microsoft Graph, in altri termini le chiamiamo Scope.
L’elenco completo di scope per l’API Microsoft Graph - https://docs.microsoft.com/en-us/graph/permissions-reference.
Fai clic sul pulsante + Add a permission e seleziona Microsoft Graph.
Fai clic su Delegated permissions. Ora vedi un elenco di autorizzazioni disponibili per l’API Microsoft Graph.
Seleziona le autorizzazioni richieste, fai clic sul pulsante Add permissions.
Fai clic sul pulsante Grant admin consent.

6. Consenti flussi di client pubblico.
Specifica se l’applicazione è un client pubblico. Appropriato per app che usano flussi di concessione token che non usano un redirect URI.

7. Crea una chiave per l’applicazione

Classi di supporto
Le seguenti classi di supporto sono necessarie per eseguire il codice in questa sezione. Queste classi servono solo a semplificare la dimostrazione.
Classe AzureROPCTokenProvider
Un’istanza di IGraphClient la classe gestisce la costruzione delle richieste, l’invio all’API Microsoft Graph e l’elaborazione delle risposte. Per creare una nuova istanza di questa classe, è necessario fornire un’istanza di ITokenProvider, che può autenticare le richieste a 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();
}
}