Google服务器到服务器OAuth2 PHP示例不起作用

时间:2019-03-24 05:59:26

标签: php google-api google-oauth google-api-php-client

我正在按照此示例操作,以使我的PHP应用程序与Google Cloud API之间能够进行服务器到服务器的访问, https://developers.google.com/api-client-library/php/auth/service-accounts。特别是,我需要访问Drive API。

尽管运行该应用程序时出现以下错误:

   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."
    }

这就是我所做的:

  • 创建了一个GCP项目
  • 为项目添加了一个服务帐户,具有域范围的委派和一组密钥
  • 在项目中启用了Google Drive API
  • 在我的G Suite帐户中的“管理API客户端访问权限”下,我已添加我的服务帐户的客户端ID,并获得了https://www.googleapis.com/auth/drive
  • 的许可。

我错过了一步吗?

这是我的代码:

    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();

该示例不包括setScopes()调用,但是没有它,我遇到了与范围相关的错误。 (该示例不是基于Drive API,因此在这种情况下可能不是必需的?)

更新:在GCP的IAM设置中,我添加了作为项目所有者的服务帐户的电子邮件地址,但这没什么区别。

1 个答案:

答案 0 :(得分:0)

我发现了问题。

在上面的setScopes()调用中,传递的值必须与在G Suite中设置客户端时给出的值相同,在这种情况下为https://www.googleapis.com/auth/drive