Google PHP Client API: Insufficient Permission

13,433

The apps#list method requires authorization with the scope https://www.googleapis.com/auth/drive.apps.readonly. Just add it to the array of scopes:

$client->setAssertionCredentials(new Google_Auth_AssertionCredentials(
  SERVICE_ACCOUNT_NAME,
  array('https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.apps.readonly'),
  $key)
);
Share:
13,433
Dino
Author by

Dino

Data Warehouse, Business Intelligence & Data Mining Consultant focus on following products: Microsoft SQL Server 2000, 2008, 2012 and 2014 (Database, SSRS, SSAS) Pentaho Open Source BI (Pentaho Data Integration, Pentaho Analysis, Action Sequence, BI Platform) Lucene / SOLR R Statistic MySQL Weka Apache Hadoop Protovis Visualization

Updated on June 23, 2022

Comments

  • Dino
    Dino almost 2 years

    I have PHP code that use Google PHP Client API to use Drive service.

    <?php
    require_once 'Google/Client.php';
    require_once 'Google/Service/Drive.php';
    
    const CLIENT_ID = '[MYCLIENTID]';
    const SERVICE_ACCOUNT_NAME = '[MYSERVICEACCOUNID]';
    
    // Make sure you keep your key.p12 file in a secure location, and isn't
    // readable by others.
    const KEY_FILE = './[MYPRIVATEKEY].p12';
    
    // Load the key in PKCS 12 format (you need to download this from the
    // Google API Console when the service account was created.
    $client = new Google_Client();
    $client->setApplicationName("Google Drive Sample");
    
    $key = file_get_contents(KEY_FILE);
    $client->setClientId(CLIENT_ID);
    $client->setAssertionCredentials(new Google_Auth_AssertionCredentials(
      SERVICE_ACCOUNT_NAME,
      array('https://www.googleapis.com/auth/drive'),
      $key)
    );
    
    $client->setClientId(CLIENT_ID);
    
    if ($client->getAuth()->isAccessTokenExpired()) {
      $client->getAuth()->refreshTokenWithAssertion();
    }
    
    // Get the json encoded access token.
    $token = $client->getAccessToken();
    
    echo "<pre>";
    $service = new Google_Service_Drive($client);
    $service->apps->listApps();
    echo "</pre>";
    ?>
    

    I had CLIENT_ID, SERVICE_ACCOUNT_NAME and KEY_FILE correctly installed. When I run the code I get the following error messages:

    Fatal error:  Uncaught exception 'Google_Service_Exception' with message 'Error calling GET https://www.googleapis.com/drive/v2/apps: (403) Insufficient Permission' in C:\xampp\htdocs\oauth\Google\Http\REST.php:79
    Stack trace:
    #0 C:\xampp\htdocs\oauth\Google\Http\REST.php(44): Google_Http_REST::decodeHttpResponse(Object(Google_Http_Request))
    #1 C:\xampp\htdocs\oauth\Google\Client.php(499): Google_Http_REST::execute(Object(Google_Client), Object(Google_Http_Request))
    #2 C:\xampp\htdocs\oauth\Google\Service\Resource.php(195): Google_Client->execute(Object(Google_Http_Request))
    #3 C:\xampp\htdocs\oauth\Google\Service\Drive.php(1281): Google_Service_Resource->call('list', Array, 'Google_Service_...')
    #4 C:\xampp\htdocs\oauth\drive_client.php(41): Google_Service_Drive_Apps_Resource->listApps()
    #5 {main}
      thrown in C:\xampp\htdocs\oauth\Google\Http\REST.php on line 79
    

    What may be wrong with the code?

  • Dino
    Dino about 10 years
    Oh wow, I'm not aware of the scope really :( It's working perfectly now! Thank you very much Vinicius!