Configurazione Azure AD e autenticazione Microsoft Graph
Aspose.Email per Java fornisce un’integrazione completa con Microsoft Graph, consentendo agli sviluppatori di gestire messaggi, contatti, calendari e attività da account Microsoft 365. Questa guida ti accompagna nella creazione di un’applicazione Azure AD e nella configurazione dell’autenticazione per iniziare a programmare con Aspose.Email GraphClient.
Prima di utilizzare le API Microsoft Graph con Aspose.Email, è necessario registrare un’applicazione in Azure Active Directory (Azure AD) e configurare l’autenticazione. Questa pagina copre:
-
Creazione di un’applicazione Azure AD (progetto).
-
Assegnazione delle autorizzazioni Microsoft Graph necessarie.
-
Generazione delle credenziali (client ID, client secret, tenant ID).
-
Autenticazione in Java usando i provider di token di Aspose.Email.
Una volta completato, sarai pronto a interagire con Microsoft Graph dalla tua applicazione Java.
1. Crea un’Applicazione Azure AD
Segui questi passaggi per registrare la tua applicazione nel portale Azure:
- Accedi al Portale Azure.
- Vai a Azure Active Directory → App Registrations → New Registration.

- Inserisci un Nome per la tua applicazione (es., AsposeEmailGraphApp).
- Scegli i tipi di account supportati:
- Single tenant (se solo la tua organizzazione lo utilizzerà)
- Multitenant (se più organizzazioni necessitano di accesso)
- Facoltativamente, imposta un Redirect URI (necessario per l’autenticazione interattiva o web).
- Fai clic su Register.

2. Crea un Client Secret
- Dopo la registrazione, vai a Certificates & Secrets → New Client Secret.
- Aggiungi una descrizione e il periodo di scadenza.

- Copia il valore del segreto generato - non lo vedrai più.
Mantieni il client secret al sicuro; è necessario per l’autenticazione del client confidenziale.
Dovresti vedere il pannello delle applicazioni appena registrate.

3. Configura le Autorizzazioni Microsoft Graph
- Vai a API Permissions → Add a Permission → Microsoft Graph.
- Scegli il tipo di autorizzazioni: Delegated o Application, a seconda del tuo scenario.
- Aggiungi le autorizzazioni richieste per le operazioni di Aspose.Email:
- Contacts.ReadWrite – per gestire i contatti
- Calendars.ReadWrite – per gestire i calendari
- Mail.ReadWrite – per leggere e inviare messaggi
- Tasks.ReadWrite – per gestire le attività
- Fai clic su Grant Admin Consent se necessario.

4. Consenti flussi di client pubblico
Specifica se l’applicazione è un client pubblico. Appropriato per app che utilizzano flussi di token grant che non usano un URI di reindirizzamento.

5. Autenticazione Microsoft Graph
Metodi di Autenticazione Supportati in Aspose.Email
| Provider di Token | Caso d’Uso | | ——————————– | ————————————————————————————— | | AzureConfidentialTokenProvider | Client confidenziale (client ID + secret) per applicazioni server-side | | AzureROPCConfiguration | Credenziali del Proprietario della Risorsa (nome utente + password) per scenari non interattivi | | AzurePublicTokenProvider | Client pubblico (login interattivo) | | AzureTokenProviderBase | Classe base per implementazioni di autenticazione personalizzate |
Autenticazione tramite un Client Confidenziale
Usa il AzureConfidentialTokenProvider per autenticare quando disponi di client ID, client secret e tenant ID:
AzureConfidentialTokenProvider provider = new AzureConfidentialTokenProvider(
tenantId,
clientId,
clientSecret
);
IGraphClient client = GraphClient.getClient(provider, tenantId);
client.setResource(ResourceType.Users);
client.setResourceId(username);
client.setEndpoint("https://graph.microsoft.com");
Questo configura un IGraphClient completamente autenticato pronto a interagire con Microsoft Graph.
Autenticazione tramite ROPC (Nome Utente e Password)
Per scenari in cui disponi di nome utente e password, usa AzureROPCConfiguration:
AzureROPCConfiguration ropcConfig = new AzureROPCConfiguration(
tenantId,
clientId,
clientSecret,
username,
password
);
IGraphClient client = GraphClient.getClient(ropcConfig, tenantId);
client.setResource(ResourceType.Users);
client.setResourceId(username);
client.setEndpoint("https://graph.microsoft.com");
Provider di Token Personalizzati per Microsoft Graph
Aspose.Email per Java si integra con Microsoft Graph tramite il IGraphClient interfaccia. Per autenticare le richieste, è necessaria un’implementazione di ITokenProvider è necessario. Sebbene la maggior parte degli sviluppatori utilizzi i provider di autenticazione integrati, ci sono scenari in cui potresti voler creare il tuo provider, ad esempio quando lavori con il flusso Resource Owner Password Credentials (ROPC).
1. Implementare ITokenProvider usando AzureROPCTokenProvider
Questa classe fornisce un’implementazione di ITokenProvider utilizzando il flusso Azure Resource Owner Password Credentials (ROPC). Il seguente esempio è solo a scopo dimostrativo. In produzione, consigliamo di utilizzare flussi più sicuri come le credenziali client o il codice di autorizzazione con PKCE.
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 = getToken();
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> getToken() {
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();
}
}
2. Creare un Oggetto ITokenProvider
Il IGraphClient l’interfaccia è responsabile della creazione delle richieste, dell’invio a Microsoft Graph e della gestione delle risposte. Per creare un’istanza di IGraphClient, devi fornire un’implementazione di ITokenProvider. Il provider di token autentica le richieste fornendo un token di accesso OAuth valido.
Il seguente esempio di codice dimostra come creare un’implementazione di base inline di ITokenProvider interfaccia, necessaria per autenticare le richieste a Microsoft Graph:
ITokenProvider tokenProvider = new ITokenProvider() {
Date expirationDate = null;
@Override
public void dispose() {
// Clean up resources if necessary
}
@Override
public OAuthToken getAccessToken(boolean ignoreExistingToken) {
// Retrieve an OAuth access token.
// If ignoreExistingToken is true, always request a new token.
// Otherwise, return the existing token if it is valid, or request a new one.
return null;
}
@Override
public OAuthToken getAccessToken() {
// Return a valid OAuth token.
// If no valid token exists, request a new one.
return new OAuthToken("token", expirationDate);
}
};
3. Utilizzo del Provider di Token Personalizzato
Una volta che ITokenProvider è configurato, puoi creare un GraphClient istanza. Questo client utilizzerà il provider di token fornito per l’autenticazione quando si chiamano le API di Microsoft Graph.
ITokenProvider provider = new AzureROPCTokenProvider(
tenantId,
clientId,
clientSecret,
userName,
password,
new String[] {"https://graph.microsoft.com/.default"}
);
IGraphClient client = GraphClient.getClient(provider, tenantId);
client.setResource(ResourceType.Users);
client.setResourceId(userName);
client.setEndpoint("https://graph.microsoft.com");
// Now you can call Microsoft Graph APIs
var folders = client.listFolders(null);
for (GraphFolderInfo folder : folders) {
System.out.println(folder.getDisplayName());
}
Dopo che il client è stato creato e autenticato, puoi iniziare a fare richieste ai servizi Microsoft Graph.