Microsoft Graph SDK для Java — ошибка InvalidAuthenticationToken 80049217

Мой клиент авторизации: Angular, сервер ресурсов: Java Spring Boot, сервер авторизации: Azure Active Directory

Я использую oAuth2 для входа через Angular через поток авторизации PKCE, а затем передаю токен на сервер. Я могу получить доступ к токену в своей серверной части через заголовок Authorization Beaer, но когда я использую этот токен для доступа к Microsoft Graph API, я получаю исключение Invalid token.

com.microsoft.graph.http.GraphServiceException: Код ошибки: InvalidAuthenticationToken Сообщение об ошибке: Ошибка синтаксического анализа CompactToken с кодом ошибки: 80049217

Я не уверен, почему это вызывает эту ошибку, потому что она действительна, и я могу проверить через https://jwt.io/ и получить доступ к моему другому защищенному API в почтальоне с токеном.

AuthProvider.java

public class AuthProvider implements IAuthenticationProvider {

    private String accessToken = null;

    public AuthProvider(String accessToken) {

        this.accessToken = accessToken;
    }

    @Override
    public void authenticateRequest(IHttpRequest request) {
        // Add the access token in the Authorization header
        request.addHeader("Authorization", "Bearer " + accessToken);
    }
}

SecurityConfiguration.java

    http.cors().and()
            .authorizeRequests().antMatchers("/home").permitAll()
            .and()
            .authorizeRequests().antMatchers("/actuator/health").permitAll()
            .and()
            .authorizeRequests().antMatchers("/**").authenticated()
            .and()
            .oauth2ResourceServer().jwt();
                    
            

GraphAPIController.java

private static IGraphServiceClient graphClient = null;
private static AuthProvider authProvider = null;

private static void ensureGraphClient(String accessToken) {
    if (graphClient == null) {
        // Create the auth provider
        authProvider = new AuthProvider(accessToken);

        // Create default logger to only log errors
        DefaultLogger logger = new DefaultLogger();
        logger.setLoggingLevel(LoggerLevel.ERROR);

        // Build a Graph client
        graphClient = GraphServiceClient
                .builder()
                .authenticationProvider(authProvider)
                .logger(logger)
                .buildClient();
    }
}

@GetMapping("/getUser")
public static User getUser(@RequestHeader(value = "Authorization") String token) {

    System.out.println("THE TOKEN: " +token);
    ensureGraphClient(token);

    // GET /me to get authenticated user
    User me = graphClient
            .me()
            .buildRequest()
            .get();
    System.out.println("THE USER: " + me);
    return me;
}

Моя угловая настройка:

приложение.модуль: импортировать {OAuthModule} из 'angular-oauth2-oidc';

app.component.ts

Почтальон:

Для доступа к какому «другому защищенному API» вы можете использовать этот токен? Можете ли вы предоставить запрос? Кроме того, пожалуйста, поделитесь кодом о том, как вы получаете токен доступа.

Allen Wu 15.12.2020 06:44

@AllenWu я добавил в дополнительный код

nabeelh21 15.12.2020 15:38

Опубликовали ответ. Если это полезно для вас, вы можете принять его как ответ (нажмите на галочку рядом с ответом, чтобы переключить его с серого на заполненный). См. meta.stackexchange.com/questions/5234/…. Это может быть полезно другим участникам сообщества. Спасибо.

Allen Wu 16.12.2020 02:54

Привет, у тебя была возможность заглянуть в мой ответ? Любые обновления?

Allen Wu 18.12.2020 08:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
1 362
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Токен доступа может быть только для одного ресурса. Я вижу, что вы настраиваете scope: 'openid api://{appid}/app' в настройках Angular. Это означает, что токен доступа предназначен для этого ресурса api://{appid}/app, а не для Microsoft Graph https://graph.microsoft.com. Вот почему вы получили ошибку InvalidAuthenticationToken.

Поэтому, если вы хотите вызывать Microsoft Graph в своем внутреннем API, вам необходимо учитывать OAuth 2.0 On-Behalf-Of flow. Поток OAuth 2.0 On-Behalf-Of (OBO) служит для случая использования, когда приложение вызывает службу/веб-API, который, в свою очередь, должен вызывать другую службу/веб-API.

В вашем случае ваш внутренний API — это веб-API A, а Microsoft Graph — веб-API B.

Образец для ознакомления.

Спасибо за помощь! Это именно то, что я искал. Я собираюсь реализовать поток On-Behalf-Of

nabeelh21 18.12.2020 20:55

Другие вопросы по теме