【问题标题】:How to access Google Spreadsheets with a service account credentials?如何使用服务帐户凭据访问 Google 电子表格?
【发布时间】:2014-11-21 18:23:45
【问题描述】:

我已经用 PHP 创建了一个服务器端应用程序,它应该可以与 Google 电子表格一起使用。

我能够通过 OAuth 2.0 身份验证成功进行身份验证,但是在向 Google 请求电子表格列表时,我只获得了电子表格所有者与服务帐户共享的电子表格。

有没有一种方法可以让服务帐户检索我的主帐户而不是服务帐户拥有的所有电子表格,包括那些未明确与服务帐户共享的电子表格?

此外,我仍然希望将电子表格保密,这样未经我的许可,任何人都无法访问它们,但我需要服务帐户才能完全访问现有电子表格和新电子表格。

感谢任何建议。

【问题讨论】:

  • 请澄清:您的问题与*.com/questions/14187030/…*.com/questions/14124946/… 有何不同
  • 1.据我所知,电子表格不是 Google Drive API 的一部分。 2. 我认为我不能授予服务帐户被服务帐户授权的访问权限。
  • 如何反其道而行之?我有通过在服务帐户下发出 google API 调用创建的电子表格,但我无法访问它。它说访问受到限制。如何向 Google 解释我想要创建共享给其他人的电子表格,而不仅仅是服务帐户?

标签: php list google-sheets shared


【解决方案1】:

这是一个示例脚本,它使用服务帐户来读取 Google 电子表格表格的内容。查看 README 以获取设置说明:

https://github.com/juampynr/google-spreadsheet-reader

【讨论】:

  • 我从这个自述文件中得到的是,您必须与服务帐户电子邮件地址共享 Google 表格。这解决了我的问题。
  • 是的,这是真的。出于某种原因,当我尝试与服务帐户电子邮件共享新工作表时,工作表告诉我有一个错误。为什么会出现这种情况?
【解决方案2】:

你必须改变方法:

  1. 在云端硬盘中创建服务帐户。您只能通过 API 管理和使用此帐户(通常不能通过 Web 界面)

  2. 使用 Drive API,您可以列出、创建、更新、删除和更改文件的权限。创建新文件时,您可以始终使用 API 将其共享给您想要的用户,公开新文件或更改所有权。

请看:https://developers.google.com/drive/v2/reference/permissions

【讨论】:

    【解决方案3】:

    我假设您使用的是 Google Apps,而不是个人 GMail 帐户。您可以使用您的服务帐号冒充您的主帐号。

    请注意,这里我所说的服务帐户是 Google 的意思:一个私钥(p12 格式)和一个标识符。这不是用于技术目的的 Google Apps 帐户。 More information here.

    这是由:

    1. 在您的 Google Apps 域中授权您的服务帐户
    2. 修改用于生成 API 凭据的代码

    Spreadsheet API 和 Drive API 的步骤完全相同。

    要首先授权您的服务帐户模拟域用户,您可以关注this documentation。以下是基本步骤。您必须是域超级管理员才能执行此任务。

    1. 转到您的 Google Apps 域的管理控制台:https://admin.google.com
    2. 从控件列表中选择安全。如果您没有看到 Security 列出,请选择 更多 控件从页面底部的灰色栏中,然后选择 安全来自控件列表。
    3. 选择高级设置 选项列表。
    4. 选择管理第三方 OAuth 客户端访问权限身份验证部分。
    5. 客户名称 字段中输入 服务帐户的客户端 ID。在一个或多个 API 范围字段中 输入应授予您的应用程序的范围列表 进入。在您的情况下,这至少是电子表格 API 范围:https://spreadsheets.google.com/feeds

    完成后,您需要更新代码以模拟您的主帐户:

    $key = file_get_contents($SERVICE_ACCOUNT_PKCS12_FILE_PATH);
    $auth = new Google_AssertionCredentials(
          'YOUR_SERVICE_ACCOUNT_EMAIL',
          array('https://spreadsheets.google.com/feeds'),
          $key);
    $auth->sub = 'yourmainaccount@domain.com';
    

    然后,您可以使用 $authvariable 生成访问电子表格 API 所需的 OAuth 令牌。我不确定您为此使用哪个客户端,因此您注入访问令牌的方式将取决于您使用的客户端。

    另外,请注意此令牌将在 1 小时后过期,然后 API 将开始返回 Session Expired 错误。如果您的客户端没有自动处理此问题,您将需要捕获错误并重新生成令牌。

    【讨论】:

    • 不幸的是,它是 Gmail 帐户。
    • 那么你应该给你的应用程序你的主帐户而不是服务帐户的权利。您只能将这些权限限制为电子表格。
    • 但是我不能有主账户的.p12认证文件,只能用于服务一。
    • 即主账户的 OAuth 2.0 没有用户交互是行不通的。
    • 还有更多的问题。用户需要登录他们的谷歌账户,如果他们真的有一个,否则他们需要注册,这将要求他们向谷歌提供他们的电话号码和类似的东西。问题。