4

我正在尝试使用 Google 所称的“域范围委派”服务帐户:https ://developers.google.com/admin-sdk/directory/v1/guides/delegation

我试图通过这个代表团访问的特定 API 是:https ://developers.google.com/apps-script/api/

这是代码:

from google.oauth2 import service_account
import googleapiclient.discovery
import json
import os

SCOPES = ['https://www.googleapis.com/auth/script.projects', 'https://www.googleapis.com/auth/drive']
SERVICE_KEY = json.loads(os.environ['SERVICE_KEY'])

credentials = service_account.Credentials.from_service_account_info(SERVICE_KEY, scopes=SCOPES)
delegated_credentials = credentials.with_subject('fred.bloggs@my-gapps-domain.com')
script = googleapiclient.discovery.build('script', 'v1', credentials=delegated_credentials)

response = script.projects().get(scriptId='<myscriptId>').execute()
print json.dumps(response)

这失败了:

google.auth.exceptions.RefreshError: ('unauthorized_client: Client is unauthorized to retrieve access tokens using this method.', u'{\n  "error" : "unauthorized_client",\n  "error_description" : "Client is unauthorized to retrieve access tokens using this method."\n}')

我很确定我已经按照https://developers.google.com/api-client-library/python/auth/service-accounts的所有步骤,包括授权“ https://www.googleapis.com /auth/script.projects的范围与我下载的服务帐户 json 密钥的客户端 ID。

在此处输入图像描述

请注意,我能够通过跳过with_subject并以用户身份进入脚本仪表板并“共享”脚本项目,成功地使这个特定的片段工作。

不幸的是,尽管这仍然不允许上传一组新文件(因为“共享”不能删除)。它至少确认我的调用代码是正确的,尽管没有使用 json 服务密钥正确验证。

澄清:

  • 我认为有问题的脚本被称为“独立”(不是网络应用程序)
  • 它归我设置的机器人用户所有,就像普通 GSuite 用户一样(因为我不希望普通用户的 Google Drives 中有脚本)
  • 该脚本在似乎是自动创建的 Google Cloud 项目中开始,并且“无组织”。然后,我在组织内手动创建了一个新项目,并将脚本移至该项目。

现在有一个官方的 Google Apps Script 客户端,所以我也在那里问过https://github.com/google/clasp/issues/225#issuecomment-400174500 - 虽然他们使用 Javascript API(通过 Typescript),但原则应该是相同的。

4

0 回答 0