我已经用 PHP 创建了一个服务器端应用程序,该应用程序应该与 Google 电子表格一起使用。
我能够使用 OAuth 2.0 身份验证成功进行身份验证,但是当从 Google 请求电子表格列表时,我只能获取电子表格所有者与服务帐户共享的电子表格。
有没有一种方法可以让服务帐户检索我的主帐户而非服务帐户拥有的所有电子表格,包括那些未与服务帐户明确共享的电子表格?
此外,我仍然希望将电子表格保密,以便未经我的许可任何人都无法访问它们,但我需要服务帐户才能完全访问现有和新的电子表格。
如有任何建议,我们将不胜感激。
这里是一个示例脚本,它使用服务帐户读取 Google 电子表格的内容。查看自述文件以获取设置说明:
你必须改变方法:
在云端硬盘中创建服务帐户。您只能通过 API 来管理和使用此帐户(而不是像通常那样通过 Web 界面)
使用 Drive API,您可以列出、创建、更新、删除和更改文件的权限。创建新文件时,您可以将其共享(始终使用 API)给您想要的用户、公开新文件或更改所有权。
请查看:https://developers.google.com/drive/v2/reference/permissions
我假设您使用 Google Apps 而不是个人 GMail 帐户。您可以使用您的服务帐户来模拟您的主帐户。
请注意,这里我所说的是 Google 所指的服务帐户:私钥(p12 格式)和标识符。这不是用于技术目的的 Google Apps 帐户。 更多信息请点击这里。
这是由 :
完成的电子表格 API 和 Drive API 的步骤完全相同。
要首先授权您的服务帐户来模拟域用户,您可以按照此文档进行操作。以下是基本步骤。您必须是域超级管理员才能执行此任务。
完成此操作后,您需要更新您的代码,以便它模拟您的主帐户:
$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
错误。如果您的客户端没有自动处理此问题,您将需要捕获错误并重新生成令牌。
我是这样做的:
IAM & Admin
Service Accounts
Create service account
[email protected]
)KEYS
选项卡,创建一个新密钥:ADD KEY --> Create new key
(选择 JSON)。现在,您将服务帐户与 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)