我正在尝试使用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'范围。
请注意,通过跳过with_subject
,并以用户身份进入脚本仪表板并“共享”脚本项目,我能够成功地使此特定代码段起作用。
不幸的是,尽管如此仍然不允许上传新的文件集(因为“共享”不允许删除)。它至少可以确认我的调用代码正确,尽管无法使用json服务密钥正确进行身份验证。
要澄清:
现在有一个正式的Google Apps Script客户端,所以我也问https://github.com/google/clasp/issues/225#issuecomment-400174500-尽管他们使用Javascript API(通过Typescript),但原理应该相同。