Nastavení Azure AD a autentizace Microsoft Graph
Aspose.Email pro Java poskytuje plnou integraci s Microsoft Graph, umožňující vývojářům spravovat zprávy, kontakty, kalendáře a úkoly z účtů Microsoft 365. Tento průvodce vás provede tvorbou Azure AD aplikace a konfigurací autentizace pro zahájení programování s Aspose.Email GraphClient.
Před použitím Microsoft Graph API s Aspose.Email musíte zaregistrovat aplikaci v Azure Active Directory (Azure AD) a nakonfigurovat autentizaci. Tato stránka pokrývá:
-
Vytvoření Azure AD aplikace (projektu).
-
Přiřazení potřebných oprávnění Microsoft Graph.
-
Generování přihlašovacích údajů (client ID, client secret, tenant ID).
-
Autentizace v Javě pomocí poskytovatelů tokenů Aspose.Email.
Po dokončení budete připraveni komunikovat s Microsoft Graph z vaší Java aplikace.
1. Vytvořte Azure AD aplikaci
Postupujte podle těchto kroků k registraci vaší aplikace v Azure portálu:
- Přihlaste se k Azure portál.
- Přejděte na Azure Active Directory → App Registrations → New Registration.

- Zadejte Name pro vaši aplikaci (např. AsposeEmailGraphApp).
- Vyberte podporované typy účtů:
- Single tenant (pokud jej bude používat pouze vaše organizace)
- Multitenant (pokud potřebuje přístup více organizací)
- Volitelně nastavte Redirect URI (potřebné pro interaktivní nebo webovou autentizaci).
- Klikněte na Register.

2. Vytvořte client secret
- Po registraci přejděte na Certificates & Secrets → New Client Secret.
- Přidejte popis a dobu platnosti.

- Zkopírujte vygenerovanou hodnotu secretu – nebudete ji vidět znovu.
Uchovejte client secret v bezpečí; je vyžadován pro autentizaci důvěrného klienta.
Měli byste vidět panel nově registrovaných aplikací.

3. Konfigurace oprávnění Microsoft Graph
- Přejděte na API Permissions → Add a Permission → Microsoft Graph.
- Vyberte typ oprávnění: Delegated nebo Application, v závislosti na vašem scénáři.
- Přidejte oprávnění požadovaná pro operace Aspose.Email:
- Contacts.ReadWrite – pro správu kontaktů
- Calendars.ReadWrite – pro správu kalendářů
- Mail.ReadWrite – pro čtení a odesílání zpráv
- Tasks.ReadWrite – pro správu úkolů
- Klikněte na Grant Admin Consent pokud je to potřeba.

4. Povolení toků veřejného klienta
Určete, zda je aplikace veřejný klient. Vhodné pro aplikace používající token grant toky, které nevyužívají redirect URI.

5. Autentizace Microsoft Graph
Podporované metody autentizace v Aspose.Email
| Poskytovatel tokenu | Případ použití | | ——————————– | ————————————————————————————— | | AzureConfidentialTokenProvider | Důvěrný klient (client ID + secret) pro serverové aplikace | | AzureROPCConfiguration | Resource Owner Password Credentials (uživatelské jméno + heslo) pro neinteraktivní scénáře | | AzurePublicTokenProvider | Veřejný klient (interaktivní přihlášení) | | AzureTokenProviderBase | Základní třída pro vlastní implementace autentizace |
Autentizace pomocí důvěrného klienta
Použijte AzureConfidentialTokenProvider pro autentizaci, pokud máte client ID, client secret a 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");
Tímto se nastaví plně autentizovaný IGraphClient připravený k interakci s Microsoft Graph.
Autentizace pomocí ROPC (Uživatelské jméno a heslo)
Pro scénáře, kde máte uživatelské jméno a heslo, použijte 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");
Vlastní poskytovatelé tokenů pro Microsoft Graph
Aspose.Email pro Java integruje s Microsoft Graph přes IGraphClient rozhraní. Pro autentizaci požadavků je potřeba implementace ITokenProvider je vyžadováno. Zatímco většina vývojářů používá vestavěné poskytovatele ověřování, existují scénáře, kdy můžete chtít vytvořit svého vlastního poskytovatele, například při práci s tokem Resource Owner Password Credentials (ROPC).
1. Implementace ITokenProvider pomocí AzureROPCTokenProvider
Tato třída poskytuje implementaci ITokenProvider pomocí toku Azure Resource Owner Password Credentials (ROPC). Následující příklad slouží pouze pro demonstraci. V produkčním prostředí doporučujeme používat bezpečnější toky, jako jsou klientské pověření nebo autorizační kód s 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. Vytvořte objekt ITokenProvider
The IGraphClient rozhraní je odpovědné za vytváření požadavků, jejich odesílání do Microsoft Graph a zpracování odpovědí. Pro vytvoření instance IGraphClient, musíte poskytnout implementaci ITokenProvider. Poskytovatel tokenů autentizuje požadavky tím, že poskytuje platný OAuth přístupový token.
Následující ukázkový kód demonstruje, jak vytvořit základní inline implementaci ITokenProvider rozhraní, které je vyžadováno pro autentizaci požadavků 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. Použití vlastního poskytovatele tokenů
Jakmile ITokenProvider je nastaven, můžete vytvořit GraphClient instanci. Tento klient bude při volání Microsoft Graph používat poskytnutý token provider pro autentizaci.
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());
}
Po vytvoření a autentizaci klienta můžete začít posílat požadavky na služby Microsoft Graph.