Мне нужно читать почту из почтового ящика 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 Запрещено. Чтобы избежать проблем с разрешениями, я добавил в приложение все делегированные разрешения, доступные в Azure AD, и предоставил согласие администратора на все. К сожалению, ничего не изменилось. Когда я проверяю содержимое своего токена, я вижу поле scp, содержащее все разрешения. странно, что я действительно могу написать почтовый ящик. Я могу написать в черновую папку через Graph API. Но когда я беру идентификатор возвращенного сообщения и пытаюсь запросить то же сообщение, которое я только что создал, я снова получаю 403 Запрещено.
Получение токена
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();