Проблемы с проверкой подлинности звонков в Google API через OAuth

Когда я пытаюсь позвонить в API-интерфейс Google Directory с использованием аутентификации "сервер-сервер", я получаю сообщение об ошибке "Нет авторизации для доступа к этому ресурсу / API".

Что я сделал:

  1. Создано приложение в консоли разработчиков Google.
  2. Скачал закрытый ключ и посмотрел имя учетной записи службы.
  3. Активировал Admin SDK под API.
  4. Скачал google-api-php-клиент.
  5. Написал следующий код:

$serviceAccountName = 'XXXXXXXXXXX@developer.gserviceaccount.com';
$scopes = 'https://www.googleapis.com/auth/admin.directory.group';
$privateKeyFile = dirname(__FILE__).'/../certs/googleapi-privatekey.p12';

$client = new Google_Client();
$client->setApplicationName('API Project');
$client->setScopes($scopes);
$cred = new Google_Auth_AssertionCredentials($serviceAccountName, $scopes, file_get_contents($privateKeyFile));
$client->setAssertionCredentials($cred);
$client->getAuth()->refreshTokenWithAssertion();

$req = new Google_Http_Request("https://www.googleapis.com/admin/directory/v1/groups/group-id@example.com/members?maxResults=1000");

$val = $client->getAuth()->authenticatedRequest($req);

var_dump($client->getAuth()->getAccessToken());
var_dump($val->getResponseBody());
  1. Выполнение этого небольшого сценария дает действительный токен доступа, действительный в течение часа, и следующее сообщение об ошибке:

{"error": {"errors": [{"domain": "global", "reason": "запрещено", "message": "Нет доступа к этому ресурсу /api" } ], "code": 403, "message": "Нет прав доступа к этому ресурсу /api" } }

Я получаю ту же ошибку, когда пытаюсь сделать такой же запрос на игровой площадке Google OAuth с ключом доступа из моего PHP-скрипта. Нужно ли активировать доступ к данным группы для этой учетной записи службы где-нибудь в консоли разработчиков?

2 ответа

Решение

Помимо предоставления доступа идентификатору клиента учетной записи службы к указанным областям в панели управления Служб Google, необходимо указать учетной записи службы, чтобы она выдавала себя за пользователя с правами супер администратора в вашем домене Служб Google:

$auth->sub = $adminEmail;

По некоторым причинам, документы Admin SDK не содержат пример PHP, но в документах Google Drive есть пример кода для создания экземпляра служебной учетной записи.

Я методом проб и ошибок обнаружил, что удаляю "админ". из областей действия заставляет его работать (в дополнение ко всему сказанному выше о следующих шагах: https://developers.google.com/drive/web/delegation).

$cs = json_decode(file_get_contents(<MY SECRET PATH> . 'client_secrets.json'), true); 
$cs = $cs['web'];
$cred = new Google_Auth_AssertionCredentials(
    $cs['client_email'], //why do they call this "service account name" ? Misleading >:(
    array(
        'https://www.googleapis.com/auth/directory.user',
        'https://www.googleapis.com/auth/directory.group',
        'https://www.googleapis.com/auth/directory.group.member'
    ),
    $key,
    'notasecret',
    'http://oauth.net/grant_type/jwt/1.0/bearer',
    '<MY EMAIL IN THE DOMAIN>' //_my_ email as an user with admin rights
);
Другие вопросы по тегам