Аутентификация в Google Admin Directory API - PullRequest
0 голосов
/ 17 декабря 2018

(я рассмотрел похожие вопросы по SO, однако ни одно из предложений не помогло мне)

У меня есть служба API, которая работает на Google App Engine (на платформе Google Cloud).Мне нужно пройти аутентификацию в Google Admin Directory API, чтобы я мог создавать группы в нашем домене GSuite.

Сначала я попытался выполнить неявную авторизацию, следуя инструкции к Получение и предоставление учетных данных службы вручную , но я думаю, что это может быть ограничено взаимодействием между приложениями, работающими в Google App Engine.Насколько я понимаю, для общения с Google API вне App Engine требуется OAuth 2.0, поэтому я настроил это следующим образом:

Я настроил учетную запись службы App Engine по умолчанию и предоставилделегирование домена в аккаунт из Google Cloud Platform.Я также делегировал полномочия для всего домена со стороны GSuite, следуя этому руководству - https://developers.google.com/admin-sdk/reports/v1/guides/delegation#delegate_domain-wide_authority_to_your_service_account

Я сгенерировал ключ P12 для учетной записи службы.Затем я настраиваю учетные данные и использую их для создания клиентского API Google Admin Directory следующим образом:

final List<String> SCOPES = Collections.singletonList(DirectoryScopes.ADMIN_DIRECTORY_GROUP);

final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

/** Email of the Service Account */
final String SERVICE_ACCOUNT_EMAIL = "my_service_account_email@appspot.gserviceaccount.com";
final String USER_EMAIL = "myGsuiteAdmin@mydomain.com";

/** Path to the Service Account's Private Key file */
final String SERVICE_ACCOUNT_PKCS12_FILE = "myPath.p12";

String p12Password = "notasecret";

ClassLoader classLoader = this.getClass().getClassLoader();

KeyStore keystore = KeyStore.getInstance("PKCS12");
InputStream keyFileStream = classLoader.getResourceAsStream(SERVICE_ACCOUNT_PKCS12_FILE);

if (keyFileStream == null){
throw new Exception("Key File Not Found.");
}

keystore.load(keyFileStream, p12Password.toCharArray());
PrivateKey pk = (PrivateKey)keystore.getKey("privatekey", p12Password.toCharArray());

GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
    .setServiceAccountScopes(SCOPES)
    .setServiceAccountUser(USER_EMAIL)
    .setServiceAccountPrivateKey(pk)
    .build();


Directory directory = new Directory.Builder(HTTP_TRANSPORT, JSON_FACTORY, null)
.setHttpRequestInitializer(credential).build();

com.google.api.services.admin.directory.model.Group group = new Group();
group.setEmail("test@mydomain.com");
group.setName("test_group");
group.setDescription("test_group_desc");

Group googleGroup = directory.groups().insert(group).execute();

// error on the line above (403: Not Authorized to access this resource/api - forbidden)

В последней строке я получаю сообщение об ошибке, в котором я пытаюсь создать новую группу:

Group googleGroup = directory.groups().insert(group).execute();
403: Not Authorized to access this resource/api - forbidden

Что мне нужно сделать для успешной аутентификации?

1 Ответ

0 голосов
/ 17 декабря 2018

Ваше решение - следовать документации.

  1. Не используйте учетную запись службы App Engine.Создайте новую учетную запись службы.
  2. Не используйте P12 (PFX), поскольку они устарели.Большинство API больше не поддерживают их.Используйте файл учетных данных JSON.
  3. Вам необходимо делегировать полномочия по всему домену учетной записи службы.
  4. Используя учетные данные учетной записи службы, вы олицетворяете другого пользователя с привилегией домена superadmin, который вошел в систему по адресупо крайней мере один раз в G Suite и принял условия.

Выполнение делегирования полномочий G Suite для всего домена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...