Я пытаюсь использовать то, что 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-ключа службы.
Обратите внимание, я смог успешно заставить этот конкретный фрагмент работать, пропустив with_subject
, и, войдя на панель инструментов Script, как пользователь, и "поделился" проектом сценария.
К сожалению, это по-прежнему не позволяет загружать новый набор файлов (так как «общий доступ» не дает возможности удалить). Это по крайней мере подтверждает, что мой вызывающий код правильный, хотя и не проходит аутентификацию с помощью служебного ключа json.
уточнить:
- Рассматриваемый сценарий называется «автономным» (не веб-приложением).
- Он принадлежит пользователю бота, который я настроил так же, как обычный пользователь GSuite (так как я не хотел, чтобы скрипты в Google Drive обычного пользователя)
- Сценарий запустился в облачном проекте Google, который, казалось, был создан автоматически с надписью «Нет организации». Затем я вручную создал новый проект в организации и перенес сценарий в этот проект.
Сейчас есть официальный клиент Google Apps Script, поэтому я тоже спросил его https://github.com/google/clasp/issues/225#issuecomment-400174500 - хотя они используют Javascript API (через Typescript), принципы должны быть одинаковыми.