Настройка на Azure AD и удостоверяване за Microsoft Graph
Aspose.Email for Java предлага пълна интеграция с Microsoft Graph, позволявайки на разработчиците да управляват съобщения, контакти, календари и задачи от акаунти Microsoft 365. Това ръководство ви води през създаването на Azure AD приложение и конфигурирането на удостоверяване, за да започнете програмиране с Aspose.Email GraphClient.
Преди да използвате Microsoft Graph API с Aspose.Email, трябва да регистрирате приложение в Azure Active Directory (Azure AD) и да конфигурирате удостоверяване. Тази страница обхваща:
-
Създаване на Azure AD приложение (проект).
-
Назначаване на необходимите разрешения за Microsoft Graph.
-
Генериране на данни за достъп (client ID, client secret, tenant ID).
-
Удостоверяване в Java с помощта на доставчиците на токени на Aspose.Email.
След като завършите, ще сте готови да взаимодействате с Microsoft Graph от вашето Java приложение.
1. Създаване на Azure AD приложение
Следвайте тези стъпки, за да регистрирате вашето приложение в Azure портала:
- Влезте в Azure портал.
- Отидете на Azure Active Directory → App Registrations → New Registration.

- Въведете Name за вашето приложение (например, AsposeEmailGraphApp).
- Изберете поддържани типове акаунти:
- Единствено-тенант (ако само вашата организация ще я използва)
- Мултитенант (ако множество организации се нуждаят от достъп)
- По желание задайте Redirect URI (необходимо за интерактивно или уеб удостоверяване).
- Кликнете Register.

2. Създаване на клиентска тайна
- След регистрацията, отидете на Certificates & Secrets → New Client Secret.
- Добавете описание и период на валидност.

- Копирайте генерираната стойност на тайния ключ – повече няма да я видите.
Поддържайте client secret в безопасност; той е необходим за удостоверяване на поверителен клиент.
Трябва да видите панела с ново регистрираните приложения.

3. Конфигуриране на разрешения за Microsoft Graph
- Отидете на API Permissions → Add a Permission → Microsoft Graph.
- Изберете тип разрешения: Delegated или Application, в зависимост от вашия сценарий.
- Добавете разрешения, необходими за операциите на Aspose.Email:
- Contacts.ReadWrite – за управление на контакти
- Calendars.ReadWrite – за управление на календари
- Mail.ReadWrite – за четене и изпращане на съобщения
- Tasks.ReadWrite – за управление на задачи
- Кликнете Grant Admin Consent, ако е необходимо.

4. Позволяване на потоци за публичен клиент
Укажете дали приложението е публичен клиент. Подходящо за приложения, използващи потоци за предоставяне на токени, които не използват пренасочващ URI.

5. Удостоверяване в Microsoft Graph
Поддържани методи за удостоверяване в Aspose.Email
| Доставчик на токени | Случай на използване | | ——————————– | ————————————————————————————— | | AzureConfidentialTokenProvider | Поверителен клиент (client ID + secret) за сървърни приложения | | AzureROPCConfiguration | Удостоверения за собственик на ресурс (потребителско име + парола) за неинтерактивни сценарии | | AzurePublicTokenProvider | Публичен клиент (интерактивен вход) | | AzureTokenProviderBase | Базов клас за персонализирани реализации на удостоверяване |
Удостоверяване чрез поверителен клиент
Използвайте AzureConfidentialTokenProvider за удостоверяване, когато имате client ID, client secret и 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");
Това настройва напълно удостоверен IGraphClient, готов за взаимодействие с Microsoft Graph.
Удостоверяване чрез ROPC (потребителско име & парола)
За сценарии, при които разполагате с потребителско име и парола, използвайте 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");
Персонализирани доставчици на токени за Microsoft Graph
Aspose.Email for Java се интегрира с Microsoft Graph чрез IGraphClient интерфейс. За удостоверяване на заявките се изисква имплементация на ITokenProvider е задължително. Въпреки че повечето разработчици използват вградени доставчици за удостоверяване, има сценарии, при които може да искате да създадете свой собствен доставчик, например при работа с потока Resource Owner Password Credentials (ROPC).
1. Имплементиране на ITokenProvider чрез AzureROPCTokenProvider
Този клас предоставя имплементация на ITokenProvider чрез потока Azure Resource Owner Password Credentials (ROPC). Следният пример е само за демонстрационни цели. В продукция препоръчваме използването на по-сигурни потоци като удостоверения за клиент или код за упълномощаване с 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. Създаване на обект ITokenProvider
Този IGraphClient интерфейсът е отговорен за създаване на заявки, изпращането им към Microsoft Graph и обработката на отговорите. За да създадете инстанция на IGraphClient, трябва да предоставите имплементация на ITokenProvider. Доставчикът на токени удостоверява заявките, като предоставя валиден OAuth токен за достъп.
Следният пример с код демонстрира как да създадете базова вграденa имплементация на ITokenProvider интерфейс, който е необходим за удостоверяване на заявки към 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. Използване на персонализирания доставчик на токени
След като ITokenProvider е настроен, можете да създадете GraphClient инстанция. Този клиент ще използва предоставения доставчик на токени за удостоверяване при извикване на 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());
}
След като клиентът е създаден и удостоверен, можете да започнете да изпращате заявки към Microsoft Graph услуги.