如何使用域范围授权服务帐户发布Google App脚本?

时间:2018-06-26 18:42:52

标签: google-apps-script google-oauth2 google-apps-script-api clasp

我正在尝试使用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的所有步骤进行了操作,包括使用我下载的服务帐户json密钥的客户端ID授权'https://www.googleapis.com/auth/script.projects'范围。

enter image description here

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

不幸的是,尽管如此仍然不允许上传新的文件集(因为“共享”不允许删除)。它至少可以确认我的调用代码正确,尽管无法使用json服务密钥正确进行身份验证。

要澄清:

  • 有问题的脚本是我认为的“独立”脚本(不是Web应用程序)
  • 它由我设置的机器人用户拥有,就像普通的GSuite用户一样(因为我不希望普通用户的Google云端硬盘中包含脚本)
  • 该脚本始于似乎是自动创建的Google Cloud Project,并且没有组织。然后,我在组织内手动创建了一个新项目,并将脚本移至该项目。

现在有一个正式的Google Apps Script客户端,所以我也问https://github.com/google/clasp/issues/225#issuecomment-400174500-尽管他们使用Javascript API(通过Typescript),但原理应该相同。

0 个答案:

没有答案