如何使用服务帐户凭据访问 Google 电子表格?

问题描述 投票:0回答:4

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

我能够使用 OAuth 2.0 身份验证成功进行身份验证,但是当从 Google 请求电子表格列表时,我只能获取电子表格所有者与服务帐户共享的电子表格。

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

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

如有任何建议,我们将不胜感激。

php list google-sheets shared
4个回答
38
投票

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

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


15
投票

你必须改变方法:

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

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

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


2
投票

我假设您使用 Google Apps 而不是个人 GMail 帐户。您可以使用您的服务帐户来模拟您的主帐户。

请注意,这里我所说的是 Google 所指的服务帐户:私钥(p12 格式)和标识符。这不是用于技术目的的 Google Apps 帐户。 更多信息请点击这里

这是由 :

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

电子表格 API 和 Drive API 的步骤完全相同。

要首先授权您的服务帐户来模拟域用户,您可以按照此文档进行操作。以下是基本步骤。您必须是域超级管理员才能执行此任务。

  1. 转至您的 Google Apps 域的管理控制台:https://admin.google.com
  2. 从控件列表中选择安全。如果您没有看到列出的安全,请选择更多 页面底部灰色栏中的控件,然后选择 控制列表中的安全
  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 = '[email protected]';

然后,您可以使用

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

另请注意,此令牌将在 1 小时后过期,然后 API 将开始返回

Session Expired
错误。如果您的客户端没有自动处理此问题,您将需要捕获错误并重新生成令牌。


0
投票

我是这样做的:

第1步:创建服务帐户

  1. 前往 console.cloud.google.com
  2. 点击
    IAM & Admin
  3. 在左侧窗格中,单击
    Service Accounts
  4. 点击
    Create service account
  5. 继续创建服务帐户,最后您将收到该服务帐户的电子邮件(例如
    [email protected]
  6. 创建完成后,单击菜单中的电子邮件,然后前往
    KEYS
    选项卡,创建一个新密钥:
    ADD KEY --> Create new key
    (选择 JSON)。

第 2 步:使用服务帐户

现在,您将服务帐户与 Google 云端硬盘上的电子表格链接,打开电子表格,

File -> Share -> Share with others
并添加上面的服务帐户电子邮件。根据需要作为编辑者/查看者。

完成此操作后,现在您可以使用客户端库来使用服务帐户(在我的例子中,我使用了Python客户端库,但相同的概念将适用于PHP库)。

这是一个读取一系列单元格的 Python 示例:

from googleapiclient import discovery
from google.oauth2 import service_account
from pprint import pprint

credentials = service_account.Credentials.from_service_account_file('service-account.json')

service = discovery.build('sheets', 'v4', credentials=credentials)
spreadsheet_id = 'XYZ'  # TODO: Update placeholder value.
range_ = 'A1:B9'
request = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=range_)
response = request.execute()
pprint(response)
© www.soinside.com 2019 - 2024. All rights reserved.