API администратора Google, использующий PHP: 403 - Нет прав доступа к этому ресурсу / ошибка API - PullRequest
0 голосов
/ 04 октября 2019

Моя организация имеет лицензию G Suite Legacy.

Я пытаюсь составить список всех членов организационной группы с помощью SDK Google Admin (каталог api), используя PHP.

Iследуя руководству SDK Google Admin ( Выполнение делегирования полномочий G Suite для всего домена ), прочитайте все SO вопросы и ответы (например, SO вопрос 26409201 , SO вопрос 39011470 ), искал в Google, но я все еще получаю 403 - не авторизован для доступа к этому ресурсу / ошибка API .

Большинство решений указывают на учетную запись службы, которая должна выдавать себя за другогопользователь организации с ролью «супер админ». но это правильно настроено в моем приложении php, я думаю.

Короче говоря, установка приложения PHP:

  • в консоли разработчика Google:
    • созданапроект
    • добавил Admin SDK API
    • создал учетную запись службы + выбранное делегирование для всего домена
    • загрузил файл авторизации json
    • роль учетной записи службы'владелец проекта'
  • в консоли администратора Google:
    • активировал доступ к API (Консоль администратора> Безопасность> Справка по API> Включить доступ по API)
    • авторизовал идентификатор клиента учетной записи службы с необходимыми областями (Консоль администратора> Безопасность> Дополнительные параметры> Управление доступом клиента API)
  • в коде авторизации php (google api php client 2.2.2): sa олицетворяет пользователя с правами администратора
    • $ gClient-> setSubject ($ this-> ci-> config-> item ('setting') ['adminUserToImpersonate']);

Я также пытался составить список членов группы через:

  • google api explorer : отлично работает
  • скрипт Google для загрузки участников в лист Google: отлично работает

Оба с одной и той же организацией [adminUserToImpersonate]

Я больше не знаю настроек, которые я могу изменить, чтобы получить разрешение на использование API-интерфейса Справочника через учетную запись службы, которая олицетворяет пользователя-администратора.

Что такоепричина, по которой я получаю сообщение об ошибке 403 Не авторизовано?

Пользователь с правами администратора может перечислять членов группы через Google Api Explorer и скрипт Google (в Google Sheet), но не через организационный проект Google (учетная запись службы). авторизация через php клиент). Какие другие настройки нужны сервисной учетной записи?

Ниже используется код:

  • google script:
function ListGroupMembers() {
  var users = [];
  var groupKey = 'myGroupKey';
  var options = {
    maxResults: 100,
  };

  do {
    var response = AdminDirectory.Members.list(groupKey, options)
    response.members.forEach(function(user) {
      users.push([user.id, user.email, user.status]);
    });

    // For domains with many users, the results are paged
    if (response.nextPageToken) {
      options.pageToken = response.nextPageToken;
    }
  } while (response.nextPageToken);

  // Insert data in a spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Members")
  sheet.getRange(1,1,users.length, users[0].length).setValues(users);
}
  • php application:
private function initializeGoogleServiceAccount() {
  $gClient = new Google_Client();
  $gClient->setSubject($this->ci->config->item('setting')['adminUserToImpersonate']);
  $jsonAuth = $this->ci->config->item('google_service');
  $gClient->setAuthConfig(json_decode($jsonAuth, true));
  $gClient->setApplicationName($this->ci->config->item('google')['application_name']);
  $gClient->addScope(Google_Service_Directory::ADMIN_DIRECTORY_GROUP_MEMBER_READONLY);
  $gClient->setHostedDomain($this->ci->config->item('google')['hosted_domain']);

  return $gClient;
}

public function getGroupMembers($groupKey) {
  // validate groupKey
  if(!isset($groupKey)) {return;}

  // get google client
  $gClient = $this->getGoogleServiceAccount();
  $gDirectory = new Google_Service_Directory($gClient);

  $params = array(
     'groupKey' => $groupKey,
     'maxResults' => 100,
     'domain' => $this->ci->config->item('google')['hosted_domain'],
      );
  $response = $gDirectory->members->listMembers($params);
  $members = $response->getMembers();

  // if we have a paginated result set, continue doing a lookup until we are at the end
  while (isset($reponse->nextPageToken) && ($reponse->nextPageToken != '')) {
       $params = array(
            'groupKey'   => $groupKey,
            'maxResults' => 100,
            'pageToken'  => $response->nextPageToken
           );
       $response = $gDirectory->members->listMembers($params);
       $members = array_merge($members, $response->getGroups());
   }

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