Обновите подписку группы Google с помощью приложения Google App Engine - PullRequest
3 голосов
/ 13 апреля 2020

Я создаю небольшое приложение на Google App Engine (PHP), цель которого - синхронизировать внешний источник с группой Google, чтобы иметь актуальный список рассылки. (он должен запускаться как задача cron GAE)

Проект Google App Engine и группа Google находятся внутри домена GSuite.

Источники здесь , см. firestore2ggroup . php

Проблема, с которой я сталкиваюсь, связана с безопасностью, когда я пытаюсь вызвать API, я получаю ошибку 403. Никаких других подробностей не получается.

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "forbidden",
    "message": "Not Authorized to access this resource/api"
   }
  ],
  "code": 403,
  "message": "Not Authorized to access this resource/api"
 }
}

I ' Мы выполнили шаги, описанные здесь в качестве отправной точки, поскольку это было близко к моей потребности:

https://medium.com/@Skaaptjop / access-gsuite-apis-on-your-domain-using-a-service-account -e2a8dbda287 c

Итак, я сделал следующее:

  • В облачной консоли Google:

    • Разверните приложение Google Проект Engine
    • Go для IAM, служебной учетной записи, скопируйте уникальный ключ учетной записи службы GAE и включите «делегирование домена»
    • Создайте JSON закрытый ключ
    • Обновите учетную запись службы с помощью «Администратора службы каталогов» (и пользователя облачного хранилища данных для firestore)
  • В GSu ite admin:

    • Подключитесь как администратор домена к admin.google.com
    • Go к безопасности, затем "Расширенные настройки", затем "Управление доступом клиента API"
    • Добавьте один
    • и вставьте уникальный идентификатор учетной записи службы в качестве имени клиента
    • https://www.googleapis.com/auth/admin.directory.group.member (просмотр групповых подписок на вашем домене и управление ими)

обновление: я даже пытался добавить больше прав, но он все еще не работает:

enter image description here

В моем проекте я скопировал закрытый ключ JSON и установил в app.yaml переменную GOOGLE_APPLICATION_CREDENTIALS с именем файла.

Я использовал эту библиотеку Google для доступа к Группа Google:

composer Требуется Google / apiclient: ^ 2.0

try
{
  $client = new Google_Client();
  $client->setApplicationName('Pegass2GGroup');
  $client->setScopes(
    [
      Google_Service_Directory::ADMIN_DIRECTORY_GROUP,
      Google_Service_Directory::ADMIN_DIRECTORY_GROUP_MEMBER,
      Google_Service_Directory::ADMIN_DIRECTORY_USER
    ]);
  $client->useApplicationDefaultCredentials(true);
  $access_token = $client->fetchAccessTokenWithAssertion();

  print_r($access_token);

  $service = new Google_Service_Directory($client);

  /** @var $members  Google_Service_Directory_Members */
  $members = $service->members->listMembers($MAILING_LIST);

  /** @var $member  Google_Service_Directory_Member */
  foreach ($members as $member)
  {
    print_r($member->getEmail());
  }
  echo "
"; } catch (Exception $ e) {print_r ($ e); echo ""; }

Я могу сказать, что закрытый ключ загружен, потому что print_r ($ e) выдает длинное исключение, а ключ указан в списке.

print_r ($ access_token); дает следующее:

Array
(
    [access_token] => dag2qssffdVpRZEr...0BsM_QUgQ
    [expires_in] => 3599
    [token_type] => Bearer
    [created] => 1586787451
)

$ MAILING_LIST: полный адрес электронной почты в списке рассылки

1 Ответ

0 голосов
/ 16 апреля 2020

Таким образом, в приведенном выше коде не было олицетворения.

$ client-> setSubject ($ EMAIL_TO_IMPERSONATE); // admin@mydomain.com

, чтобы действовать в качестве этого электронного письма при касании данных других членов домена.

Тогда я получил эту ошибку:

(
    [errors:protected] => 
    [message:protected] => {
  "error": "unauthorized_client",
  "error_description": "Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested."
}

Это было потому, что Я запрашивал:

  Google_Service_Directory::ADMIN_DIRECTORY_GROUP,
  Google_Service_Directory::ADMIN_DIRECTORY_GROUP_MEMBER,
  Google_Service_Directory::ADMIN_DIRECTORY_USER

, но я забыл добавить в GSuite API Security Management следующее:

  Google_Service_Directory::ADMIN_DIRECTORY_USER

после добавления это сработало. Поэтому, если вы запрашиваете набор ролей, все должно быть предоставлено. Даже если я не использовал Google_Service_Directory :: ADMIN_DIRECTORY_USER, тот факт, что я спрашиваю его во время соединения, а одно из них не предоставлено, блокирует все соединение.

Я думаю, что мне нужен только Google_Service_Directory :: ADMIN_DIRECTORY_GROUP_MEMBER

До сих пор моей рабочей областью для перечисления членов группы было:

184920 .... 0484899 (идентификатор клиента)

https://www.googleapis.com/auth/admin.directory.group, https://www.googleapis.com/auth/admin.directory.group.member https://www.googleapis.com/auth/apps.groups.settings https://www.googleapis.com/auth/groups https://www.googleapis.com/auth/admin.directory.user

...