Мне нужно читать почту из почтового ящика Outlook через Graph API. Приложение, которое я пишу, представляет собой запланированное пакетное задание без взаимодействия с пользователем. Я не могу использовать разрешения приложения по причинам соответствия. Приложение не должно иметь доступ ко всем почтовым ящикам на клиенте. Для этого я использую делегированные разрешения для технического пользователя, который получил доступ к разрешенным почтовым ящикам. Я смог получить токен доступа JWT через ADAL4J и успешно вызвал с его помощью некоторые API, но всякий раз, когда я пытаюсь прочитать почтовый ящик, даже технический почтовый ящик пользователя, я получаю 403 запрещено.
Я начал с этого официального [образца] (https://github.com/Azure-Samples/active-directory-java-native-headless/). После настройки моего приложения в Azure этот образец сразу заработал. Затем я изменил вызов Graph на «https://graph.microsoft.com/v1.0/me/messages "и внезапно я получил 403 Forbidden. Чтобы избежать проблем с разрешениями, я добавил в приложение все делегированные разрешения, доступные в Azure AD, и предоставил согласие администратора на все. К сожалению, это ничего не изменило. Когда я проверяю содержимое своего токена, я вижу поле scp, содержащее все разрешения. Что странно, я действительно могу писать в почтовый ящик. Я могу писать в черновую папку через Graph API. Но когда я беру идентификатор возвращенного сообщения и пытаюсь запросить то же сообщение, которое только что создал, я снова получаю 403 Forbidden.
Получение токена
private static AuthenticationResult getAccessTokenFromUserCredentials(
String username, String password) throws Exception {
AuthenticationContext context;
AuthenticationResult result;
ExecutorService service = null;
try {
service = Executors.newFixedThreadPool(1);
context = new AuthenticationContext(AUTHORITY, false, service);
Future<AuthenticationResult> future = context.acquireToken(
"https://graph.microsoft.com", CLIENT_ID, username, password,
null);
result = future.get();
} finally {
service.shutdown();
}
return result;
}
Вызов конечной точки сообщений:
URL url = new URL("https://graph.microsoft.com/v1.0/me/messages");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
conn.setRequestProperty("Accept","application/json");
int httpResponseCode = conn.getResponseCode();