403 Запрещенная ошибка при чтении писем через Graph API с действующим токеном JWT

Мне нужно читать почту из почтового ящика 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();

person Lukas Stampf    schedule 26.03.2019    source источник


Ответы (1)


Изменение версии api на бета-версию решит эту проблему.

https://graph.microsoft.com/beta/me/messages

введите здесь описание изображения

person Tony Ju    schedule 27.03.2019
comment
Спасибо. Это решает мою проблему, но приходит с новой. Бета-версия может измениться в любой момент, поэтому я не могу использовать ее в производственной среде. Возможно, вы знаете, какие бета-изменения меняют это поведение и есть ли способ обойти это в версии 1.0? - person Lukas Stampf; 27.03.2019
comment
Добро пожаловать. Думаю, это может быть ошибка. Вы можете подать заявку в службу поддержки на портале o365 для получения дополнительной помощи. docs. microsoft.com/en-us/office365/admin/ - person Tony Ju; 27.03.2019