Поставщик учетных данных клиента Azure выдает ошибку "/me request действителен только с делегированным потоком проверки подлинности"

Я следую документации Microsoft по получению учетных данных для API Azure Graph. В этом документе говорится, что автоматическое приложение должно использовать client credentials provider при выполнении вызовов веб-API.

Пример в документах для этого:

final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
        .clientId(clientId)
        .clientSecret(clientSecret)
        .tenantId(tenant)
        .build();

List<String> scopes = Arrays.asList("https://graph.microsoft.com/.default");

final TokenCredentialAuthProvider tokenCredentialAuthProvider = new TokenCredentialAuthProvider(scopes, clientSecretCredential);

final GraphServiceClient graphClient =
  GraphServiceClient
    .builder()
    .authenticationProvider(tokenCredentialAuthProvider)
    .buildClient();

final User me = graphClient.me().buildRequest().get();

Но я встречаю исключение в последней строке:

Error message: /me request is only valid with delegated authentication flow.

Исследуя эту ошибку, я наткнулся на этот пост, который более подробно объясняет ошибку, что сбивает меня с толку относительно того, почему документация использует то, что кажется неуместным примером того, как использовать этот API. Кажется, delegated permissions authorization code flow.

Этот пост ясности не добавляет.

Как правильно сделать этот звонок? Или это результат неверных настроек конфигурации в Консоль управления Azure чтобы приложение использовало разрешения приложения вместо делегированных разрешений?

  • Удостоверение Azure = v1.3.1

Если у вас есть автоматический вызов учетных данных системы /me, какие именно данные вы надеетесь получить?

Derek Gusoff 18.11.2022 02:08

@DerekGusoff - вот мой вопрос - это пример в документации, и для меня это не имеет смысла. Почему в документе Microsoft используется неуместный пример использования?

Roy Hinkley 18.11.2022 14:44

иногда что-то не так. человек, собирающий это, копировал/вставлял некоторый код между примерами.

Derek Gusoff 18.11.2022 15:56

@DerekGusoff Спасибо, я понимаю, что документы неверны, поэтому я обращаюсь к SO, чтобы найти правильный ответ. :) Я связался с MS, но это займет некоторое время.

Roy Hinkley 18.11.2022 15:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
171
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Нет смысла вызывать /me с потоком учетных данных клиента, потому что там нет /me. Это просто автоматизированная учетная запись. У него нет пользовательских данных для извлечения.

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

Документация неверна - полностью опустите последнюю строку примера.

Вызовы к API с использованием этого потока имеют форму:

graphClient.users("user-id")

вместо того:

graphClient.me()

Чтобы отправить электронное письмо с помощью credentials provider flow:

...

graphClient.users("[email protected]")
                .sendMail(UserSendMailParameterSet
                        .newBuilder()
                        .withMessage(message)
                        .withSaveToSentItems(saveToSentItems)
                        .build())
                .buildRequest()
                .post();

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