Google Drive API PHP - unauthorized_client

时间:2018-02-01 12:58:25

标签: php google-api google-drive-api google-api-php-client service-accounts

使用服务帐户进行身份验证时遇到问题:

    putenv('GOOGLE_APPLICATION_CREDENTIALS='/path/to/google.json');
    $client = new \Google_Client();
    $client->addScope(\Google_Service_Drive::DRIVE);
    $client->useApplicationDefaultCredentials();
    $client->setAccessType('offline');
    $client->setSubject('xxx@xxx.com');

但它显示如下错误:

{
"error": "unauthorized_client",
"error_description": "Client is unauthorized to retrieve access tokens using this method."
}

当我删除

 $client->setSubject('xxx@xxx.com');

它有效(我有访问权限),但还有其他问题,我无法在google驱动器中看到通过应用程序创建的任何文件(使用UI)。从我听到它只是因为我使用服务帐户,它在自己的空间创建文件,我只能通过API访问。我也需要访问来自API和谷歌驱动器应用程序的文件。

此外,我需要访问我的谷歌硬盘而无需登录我的谷歌帐户(无需将用户重定向到谷歌登录页面)。

如果你可以帮我解决这个问题并展示一些例子,我将非常感激。

2 个答案:

答案 0 :(得分:1)

您需要记住服务帐户不是您。服务帐户是虚拟用户,它拥有自己的Google云端硬盘帐户。在您上传之前,服务帐户google云端硬盘帐户中不会有任何文件。

  1. 服务帐户没有网页视图。
  2. 您可以使用服务帐户在个人google云端硬盘帐户上共享文件夹,就像使用该电子邮件地址的任何其他用户一样。只需确保让serivce帐户更新权限,否则您将无法访问您的驱动器帐户上的文件。
  3. 服务帐户可以在其Google云端硬盘帐户上创建一个文件夹并与您共享。然后,您应该可以在Google云端硬盘帐户的网络视图中看到它。
  4. 服务帐户的存储限制链接到服务帐户的所有者,而不是其上传到的帐户。

答案 1 :(得分:0)

服务帐户用于代表用户行事。您可以将用户设置为您的帐户。这样,服务帐户代表您行事,您可以看到通过您的应用程序创建的所有内容(使用UI)。

为避免您遇到的错误,请确保完成以下操作:

  1. 使用以下链接中的说明创建服务帐户。请注意,第6步是重要的一步,不要忽略它。 https://support.google.com/a/answer/7378726?hl=en
  2. 创建服务帐户后,您需要使用G-suite授予该帐户权限。

  3. 注意:如果没有执行第3步,您将收到错误

    参考文献: https://support.google.com/a/answer/7378726?hl=en https://github.com/sazaamout/gDrive