Я пытаюсь использовать Google API с учетной записью службы. Первоначально я использовал обычную учетную запись проекта с учетными данными, и мне удалось запросить API. Чтобы использовать учетную запись службы, я изменил код, чтобы пропустить поток проверки подлинности браузера и использовать только учетные данные учетной записи службы. Похоже, тот же запрос, который использовался для работы с обычными учетными данными проекта, теперь выдает ошибку, не разъясняя многое в сообщении. Это выглядит следующим образом:
directoryService = new GoogleService().buildDirectoryService();
Users result = directoryService.users().list()
.setCustomer("my_customer")
.setOrderBy("email")
.execute();
public Directory buildDirectoryService() throws GeneralSecurityException, IOException {
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential credential = GoogleCredential
.fromStream(new FileInputStream("src/main/resources/newest_service_account_creds.json"))
.createScoped(SCOPES);
return new Directory.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.setHttpRequestInitializer(credential).build();
}
К сожалению, в сообщении об ошибке ничего не говорится:
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Invalid Input",
"reason" : "invalid"
} ],
"message" : "Invalid Input"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1108)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at GetDrivePermissions.getFiles(GetDrivePermissions.java:35)
at Main.main(Main.java:7)
Я повторил процесс два раза, чтобы убедиться, что ничего не пропустил, включая создание новый проект, включающий API, добавление учетной записи службы, добавление и включение делегирования по всему домену и получение файла учетных данных json, а также добавление доступа к приложению в App Access Control в интерфейсе администратора. Но вызов службы
directoryService.users().list().setCustomer("my_customer").setOrderBy("email").execute();
по-прежнему возвращает указанное выше сообщение об ошибке.
Сообщение об ошибке относится к «Неверный ввод», но запрос раньше работал с обычными учетными данными приложения. Поэтому проблема должна заключаться не в том, как я вызываю службу каталогов, а в моей аутентификации, единственное различие между рабочей и нерабочей версией.
Поскольку это работало с использованием учетных данных проекта, должно быть что-то неправильно с тем, как я использую учетную запись службы, но я не могу найти ошибку даже после повторения всего процесса два раза. Исходя из руководств, которые я нашел о служебных учетных записях, это должно работать. Объект учетных данных создан, и он выглядит правильно.
Что я могу посмотреть дальше?
Спасибо за любое понимание заранее.