У меня есть приложение, которое использует API Google. Я создал для него служебную учетную запись, загрузил ключи и включил делегирование по всему домену для GSuite. Области применения включают Drive. Я пытаюсь перебрать файлы Drive пользователей GSuite, используя учетную запись службы, чтобы выдать себя за пользователя следующим образом:
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
GoogleCredential.Builder builder = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(serviceAccountEmail)
.setServiceAccountPrivateKey(credFromJson(HTTP_TRANSPORT).getServiceAccountPrivateKey())
.setServiceAccountScopes(SCOPES);
builder.setServiceAccountUser(userEmail);
GoogleCredential credential = builder.build();
return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, null)
.setApplicationName(APPLICATION_NAME)
.setHttpRequestInitializer(credential).build();
GoogleCredential создан успешно. Он имеет serviceAccountId, serviceAccountPrivateKey, serviceAccountUser и необходимые области.
Однако при вызове
driveService.files().list().setFields("nextPageToken, files(*)").execute().getFiles();
я получаю 401 несанкционированную ошибку. Я вполне уверен, что все этапы, относящиеся к учетной записи службы, были успешно завершены, делегирование по всему домену включено, и даже учетные данные выглядят нормально. Сферы, конечно, правильные. Куда мне смотреть дальше?