403 Запрещенная ошибка при чтении писем через Graph API с допустимым токеном JWT - PullRequest
0 голосов
/ 27 марта 2019

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

1 Ответ

0 голосов
/ 27 марта 2019

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

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

enter image description here

...