0

I am following this example to get server-to-server access working between my PHP application and Google Cloud API's, https://developers.google.com/api-client-library/php/auth/service-accounts. In particular, I need to access the Drive API.

When I run the application though I get the following error:

   Google_Service_Exception  : {
      "error": "unauthorized_client",
      "error_description": "Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested."
    }

Here's what I have done:

  • Created a GCP project
  • Added a service account to the project, with domain wide delegation, and a set of keys
  • Enabled the Google Drive API in the project
  • In my G Suite account, under 'Manage API client access', I have added the Client ID of my service account, with the permission of https://www.googleapis.com/auth/drive

Have I missed a step?

Here's my code:

    putenv('GOOGLE_APPLICATION_CREDENTIALS=my_storage/secure/my-app-service-account.json');

    $client = new \Google_Client();
    $client->setScopes(\Google_Service_Drive::DRIVE_METADATA_READONLY);
    $client->useApplicationDefaultCredentials();
    $client->setSubject('my_email@my_domain.com');
    $drive = new \Google_Service_Drive($client);

    echo $drive->about->get();

The example does not include the setScopes() call, however I was getting a scope-related error without it. (The example is not based on the Drive API, so perhaps it's not required in that case?)

UPDATE: In the IAM settings for the GCP, I added the email address of the service account as a Project Owner, but that made no difference.

DatsunBing
  • 8,684
  • 17
  • 87
  • 172

1 Answers1

0

I found the problem.

In the setScopes() call above, the value passed needs to be the same as the value given when setting up the client in G Suite, in this case https://www.googleapis.com/auth/drive

DatsunBing
  • 8,684
  • 17
  • 87
  • 172