Я использую служебную учетную запись для делегирования безопасности домена, чтобы получить список пользователей из нашего экземпляра Служб Google для учебных заведений через API-интерфейс каталога и клиентскую библиотеку PHP.
Я совершенно уверен, что мой сервисный аккаунт имеет все необходимые параметры безопасности, потому что он может получить список с помощью API ссылки «попробуй»
Итак, на данный момент все указывает на проблему с моим кодом, но я не могу понять, где:
<?php
require 'vendor/autoload.php';
$clientEmail = '<>@developer.gserviceaccount.com';
$privateKey = file_get_contents(__DIR__ . '/access.p12');
$scopes = array(
'https://www.googleapis.com/auth/admin.directory.user.readonly',
);
$credentials = new Google_Auth_AssertionCredentials($clientEmail, $scopes, $privateKey);
$credentials->sub = '[email protected]';
$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired())
{
$client->getAuth()->refreshTokenWithAssertion();
}
$directory = new Google_Service_Directory($client);
$result = $directory->users->listUsers(array('domain' => 'my.domain'));
var_dump($result);
Код выше выдает следующую ошибку:
Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Error refreshing the OAuth2 token, message: ' in C:\wamp\www\quick\vendor\google\apiclient\src\Google\Auth\OAuth2.php on line 358
Google_Auth_Exception: Error refreshing the OAuth2 token, message: '{
"error" : "access_denied",
"error_description" : "Requested client not authorized."}' in C:\wamp\www\quick\vendor\google\apiclient\src\Google\Auth\OAuth2.php on line 358
Call Stack:
0.0010 132792 1. {main}() C:\wamp\www\quick\index.php:0
0.0260 1060248 2. Google_Auth_OAuth2->refreshTokenWithAssertion() C:\wamp\www\quick\index.php:18
0.9230 1163560 3. Google_Auth_OAuth2->refreshTokenRequest() C:\wamp\www\quick\vendor\google\apiclient\src\Google\Auth\OAuth2.php:309
Стек вызовов должен идентифицировать конкретную строку, где произошла эта ошибка. Обратите внимание, что вторая строка в стеке указывает на строку 18 вашего скрипта, где код действительно относится к проверке OAuth:
$client->getAuth()->refreshTokenWithAssertion();
Другими словами, когда вы пытаетесь обновить TokenWithAssertion, Google говорит: «access_denied, потому что запрашиваемый клиент не авторизован». Если вы пытаетесь определить, где в вашем скрипте вы нажали ошибку, я думаю, что это должно ответить на ваш вопрос.
Если вы хотите выяснить, Зачем он получил ошибку, я бы сделал несколько поисков Google для refreshTokenWithAssertion
плюс это сообщение об ошибке и посмотреть, если вы найдете каких-либо других разработчиков, работающих через аналогичную проблему. Например, выполнив этот поиск Google, я нашел эта другая страница на SO это может помочь вам.
Удачи!
Других решений пока нет …