(я рассмотрел похожие вопросы по 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
Что мне нужно сделать для успешной аутентификации?