Клиент не авторизован для получения токенов доступа с помощью этого метода, или клиент не авторизован для какой-либо запрошенной области API Directory C#

Я получаю следующую ошибку при попытке получить доступ к API каталога, получив список пользователей

Google.Apis.Auth.OAuth2.Responses.TokenResponseException: Ошибка: "unauthorized_client", Описание: "Клиент не авторизован для получения токенов доступа с помощью этого метода или клиент не авторизован для какой-либо из запрошенных областей.", Uri:""

Основываясь на моих предыдущих усилиях по поиску в Google и чтении переполнения стека, я не уверен, что вызывает это. Насколько я знаю, у меня все настроено правильно. Я настроил его для использования API-интерфейса привода очень похожим образом, и это работает отлично.

Моя учетная запись службы имеет широкое делегирование домена, поэтому я думаю, что это может иметь какое-то отношение ко второй части ошибки. Любые идеи, что может быть причиной этого?

        protected async virtual Task<DirectoryService?> GetDirectoryService()
        {
            if (currentDirectory == null)
            {
                string[] scopes = new string[] { DirectoryService.Scope.AdminDirectoryUser };

                var initializer = new ServiceAccountCredential.Initializer(configuration["GoogleServiceAccount:AccountEmail"]){Scopes = scopes, User = configuration["GoogleServiceAccount:UserEmail"] };
                var cred = new ServiceAccountCredential(initializer.FromPrivateKey(configuration["GoogleServiceAccount:SecretKey"]));

                currentDirectory = new DirectoryService(new BaseClientService.Initializer { HttpClientInitializer = cred, ApplicationName = "DriveAPI" });
            }
            return currentDirectory;
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
User = configuration["GoogleServiceAccount:UserEmail"]

Пользователь — это пользователь в вашем домене, которого вы хотите делегировать, а не адрес электронной почты сервисного аккаунта.

Обновить

Клиент не авторизован для получения токенов доступа с помощью этого метода или клиент не авторизован ни для одной из запрошенных областей.

Это сообщение об ошибке в моем опыте обычно означает, что вы используете код, который не соответствует типу используемых вами учетных данных.

Существует несколько типов авторизации, учетная запись службы, установленный Oauth и веб-сайт oauth (давайте пока не будем использовать мобильные устройства). Код, используемый для этих учетных данных, отличается.

Поэтому, если вы используете файл ключа служебной учетной записи с кодом, разработанным для установленного приложения Ouath2. Обычно вы получаете "Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested"

Код, который я обычно использую для делегирования служебной учетной записи, выглядит следующим образом. он похож на ваш, поэтому я склонен согласиться с тем, что вы используете код служебной учетной записи. Для меня это означает, что вы, вероятно, используете неправильный ключевой файл. Я бы перепроверил. Откройте его, там должно быть написано "type": "service_account".

// Load the Service account credentials and define the scope of its access.
var credential = GoogleCredential.FromFile(PathToServiceAccountKeyFile)
            .CreateWithUser("[email protected]")
            .CreateScoped(new[] {DriveService.ScopeConstants.Drive});

Я предлагаю перепроверить и убедиться, что вы используете ключевой файл учетной записи службы из облачной консоли Google , который был создан пользователем в вашем домене, и что вы настроили широкое делегирование домена и добавили admin sdk, чтобы помнить, что необходимо установить области OAuth для администратора, а также настроить авторизованного пользователя.

Спасибо за ответ! Извините, название немного сбивает с толку, но это адрес электронной почты пользователя, которого я хочу делегировать, поэтому я так запутался! Как уже упоминалось, у меня есть API-интерфейс привода, настроенный с учетной записью службы почти таким же образом, но этот получает это сообщение об ошибке.

mharre 18.09.2022 22:29

действительно, я бы дважды проверил, что вы используете правильные учетные данные.

DaImTo 19.09.2022 10:41

Вау, большое спасибо за обновленный ответ! Я разобрался со своей проблемой, оказалось, что каталог API не находится в g Suite, управляющем доступом к API. Это связано с тем, что этот проект разработан таким образом, что мне нужно иметь возможность использовать свои личные учетные данные для доступа к API каталога, делать то, что я хочу, а затем использовать учетную запись службы в паре с API диска для внесения изменений, которые Я нуждаюсь. Единственная проблема заключается в том, что мне нужно выяснить, как все это сделать, и переключаться между личной учетной записью и учетной записью службы, если это возможно, ха-ха :)

mharre 19.09.2022 18:27

два разных учетных данных и два разных сервиса. должен сделать трюк.

DaImTo 19.09.2022 18:30

Именно то, что я думал! Спасибо еще раз за помощь. Я видел, как вы отвечали на большинство вопросов об API Google еще много лет назад, и я очень ценю это.

mharre 19.09.2022 18:39

Девушке нужны ее увлечения :) Посетите мою веб-страницу и канал YouTube, чтобы найти больше примеров для клиентской библиотеки Google .net. Принимаю заявки :)

DaImTo 19.09.2022 19:55

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