Google_Service_Directory – (403) Non autorizzato per accedere a questa risorsa / api

Ho un problema usando solo un esempio della versione attuale di PHP API e utilizzando il file "service-account.php" della cartella degli esempi.

l'originale è per mostrare la "Books API", e con la mia configuration delle credenziali personali funziona bene, ma nella mia xcase devo accedere al servizio directory.groups.get per avere l'elenco degli account membri di una mail list di gruppi di google, quindi cambio il codice originale in questo:

<?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 = arrays( '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, //arrays('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 = arrays('filter' => 'free-ebooks'); //ORIGINAL $optParams = arrays('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__); 

qualunque cosa faccia, fornendo l'authorization per l'API SDK e utilizzando il file e le credenziali appena creati nel pannello API Credential dello sviluppatore della console, ricevo sempre l'errore 403.

Ecco lo stack di errori:

 #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 

Eventuali suggerimenti?

Grazie, Roberto

La radice del problema è che l'account di servizio non è un amministratore del dominio, quindi non può accedere all'API Directory di Admin SDK. Invece, devi abilitare la delega a livello di dominio per il tuo account di servizio e poi fare in modo che l'account di servizio impersonifichi un amministratore di dominio quando effettua la richiesta:

 $cred = new Google_Auth_AssertionCredentials( $service_account_name, $authArray, $key ); $cred->sub = "[email protected]";