У меня проблема с использованием только примера реальной версии PHP API и использованием файла «service-account.php» из папки примеров.
оригинал предназначен для показа «API книг», и с моей конфигурацией личных учетных данных он работает хорошо, но в моем xcase мне нужно получить доступ через службу directory.groups.get, чтобы иметь список учетных записей участников в почтовом списке групп Google, поэтому я изменяю оригинальный код в этом:
<?php
session_start();
include_once "templates/base.php";
/************************************************
Make an API request authenticated with a service
account.
************************************************/
require_once realpath(dirname(__FILE__) . '/../autoload.php');
/************************************************
************************************************/
// MY ACCOUNT DATA HERE
$client_id = 'xxx';
$service_account_name = 'xxx'; //Email Address
$key_file_location = 'xxx.p12'; //key.p12
$groupKey = 'xxx';
echo pageHeader("My Service Account Access");
if ($client_id == '<YOUR_CLIENT_ID>'
|| !strlen($service_account_name)
|| !strlen($key_file_location)) {
echo missingServiceAccountDetailsWarning();
}
$client = new Google_Client();
$client->setApplicationName("Client_Library_Examples");
//$service = new Google_Service_Books($client); //ORIGINAL
$service = new Google_Service_Directory($client);
/************************************************
************************************************/
if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}
$authArray = array(
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/admin.directory.group.readonly',
'https://www.googleapis.com/auth/admin.directory.group.member',
'https://www.googleapis.com/auth/admin.directory.group.member.readonly'
);
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
$authArray, //array('https://www.googleapis.com/auth/books'), //ORIGINAL
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();/************************************************
************************************************/
//$optParams = array('filter' => 'free-ebooks'); //ORIGINAL
$optParams = array('fields' => 'id');
//$results = $service->volumes->listVolumes('Henry David Thoreau', $optParams); //ORIGINAL
$results = $service->groups->get($groupKey, $optParams);
echo "<h3>Results Of Call:</h3>";
foreach ($results as $item) {
//echo $item['volumeInfo']['title'], "<br /> \n"; //ORIGINAL
echo "<pre>".print_r ($item, true)."</pre>";
}
echo pageFooter(__FILE__);
Что бы я ни делал, предоставляя авторизацию для API SDK и используя файлы и учетные данные, только что созданные на панели API Credentials разработчика консоли, я всегда получаю сообщение об ошибке 403.
Вот стек ошибок:
#0 /var/www/html/google_local/google-api-php-client-master/src/Google/Http/REST.php(41):
Google_Http_REST::decodeHttpResponse(Object(Google_Http_Request))
#1 /var/www/html/google_local/google-api-php-client-master/src/Google/Client.php(546):
Google_Http_REST::execute(Object(Google_Client), Object(Google_Http_Request))
#2 /var/www/html/google_local/google-api-php-client-master/src/Google/Service/Resource.php(190):
Google_Client->execute(Object(Google_Http_Request))
#3 /var/www/html/google_local/google-api-php-client-master/src/Google/Service/Directory.php(1494):
Google_Service_Resource->call('get', Array, 'Google_Service_...')
#4 /var/www/html/google_local/googl in /var/www/html/google_local/google-api-php-client-master/src/Google/Http/REST.php on line 76
Какие-либо предложения?
Спасибо,
Роберто
Корень проблемы заключается в том, что учетная запись службы не является администратором домена, поэтому она не может получить доступ к API-интерфейсу администратора SDK. Вместо этого вам нужно включить общедоменное делегирование для вашей учетной записи службы, а затем попросите учетную запись службы выдать себя за администратора домена, когда он сделает запрос:
$cred = new Google_Auth_AssertionCredentials(
$service_account_name,
$authArray,
$key
);
$cred->sub = "[email protected]";
Других решений пока нет …