У меня есть проблема, просто используя пример реальной версии 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 разработчика консоли, я получаю alwais ошибку 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 каталогов Admin SDK. Вместо этого вам необходимо включить делегирование домена для вашей учетной записи службы, а затем выполнить учетную запись службы, выдающую себя за администратора домена, когда он делает запрос:
$cred = new Google_Auth_AssertionCredentials( $service_account_name, $authArray, $key ); $cred->sub = "admin@yourdomain.com";