Проблемы с проверкой подлинности звонков в Google API через OAuth
Когда я пытаюсь позвонить в API-интерфейс Google Directory с использованием аутентификации "сервер-сервер", я получаю сообщение об ошибке "Нет авторизации для доступа к этому ресурсу / API".
Что я сделал:
- Создано приложение в консоли разработчиков Google.
- Скачал закрытый ключ и посмотрел имя учетной записи службы.
- Активировал Admin SDK под API.
- Скачал google-api-php-клиент.
- Написал следующий код:
$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());
- Выполнение этого небольшого сценария дает действительный токен доступа, действительный в течение часа, и следующее сообщение об ошибке:
{"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
);