我正在尝试使用 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),但原则应该是相同的。