Я получаю следующую ошибку при попытке получить доступ к 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;
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 не находится в g Suite, управляющем доступом к API. Это связано с тем, что этот проект разработан таким образом, что мне нужно иметь возможность использовать свои личные учетные данные для доступа к API каталога, делать то, что я хочу, а затем использовать учетную запись службы в паре с API диска для внесения изменений, которые Я нуждаюсь. Единственная проблема заключается в том, что мне нужно выяснить, как все это сделать, и переключаться между личной учетной записью и учетной записью службы, если это возможно, ха-ха :)
два разных учетных данных и два разных сервиса. должен сделать трюк.
Именно то, что я думал! Спасибо еще раз за помощь. Я видел, как вы отвечали на большинство вопросов об API Google еще много лет назад, и я очень ценю это.
Девушке нужны ее увлечения :) Посетите мою веб-страницу и канал YouTube, чтобы найти больше примеров для клиентской библиотеки Google .net. Принимаю заявки :)
Спасибо за ответ! Извините, название немного сбивает с толку, но это адрес электронной почты пользователя, которого я хочу делегировать, поэтому я так запутался! Как уже упоминалось, у меня есть API-интерфейс привода, настроенный с учетной записью службы почти таким же образом, но этот получает это сообщение об ошибке.