Проблема аутентификации при доступе к Google Sheets Python API через облачные функции - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь получить доступ к листу Google, используя облачную функцию и API листов в python, но получаю ошибку разрешений 403. Я создал служебную учетную запись, экспортировал ключ (включен в zip-функцию облачной функции, которую я загружаю) и дал этой учетной записи службы необходимые для доступа к листам области API (я пробовал https://www.googleapis.com/auth/spreadsheets и https://www.googleapis.com/auth/drive). Вот код:

import httplib2
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

def main(request):
  scope = ['https://www.googleapis.com/auth/spreadsheets','https://www.googleapis.com/auth/drive']

  credentials = ServiceAccountCredentials.from_json_keyfile_name('client_secrets.json', scope)

  service = build('sheets', 'v4', http=credentials.authorize(httplib2.Http()))

  spreadsheet_id = 'id-of-the-google-sheet'

  range = 'Sheet1!A:D'

  response = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=range).execute()

  cols = response.get('values', [])[0]
  return cols[0]

requirements.txt:

google-api-python-client
oauth2client
google-auth-httplib2
google-auth

Если я явным образом поделюсь таблицей Google с учетной записью службы, аутентификация работает, и я могу получить доступ к данным листа. Вопрос в том, почему это не работает, если использовать соответствующие области API в качестве администратора учетных записей Google?

1 Ответ

0 голосов
/ 19 апреля 2019

Разрешения Google Диска находятся в верхней части области. Области необходимы для аутентификации запроса, но права доступа к диску (и листов по расширению) определяют, кто имеет доступ к какому файлу. Если вызывающая учетная запись (в данном случае учетная запись службы) не имеет доступа к соответствующему Листу, вы получите 403, которые вы получали.

Настройка областей в консоли администратора не имеет прямой связи с разрешениями.

Следует также отметить одну вещь: если у вас есть документы, которые по умолчанию доступны всем в учетной записи G Suite, вы можете использовать Domain Wide Delegation (1) и использовать учетную запись serviceaccount для олицетворения пользователя (например, superadmin) в G Suite. домен. Вам не нужно делиться каждым документом с самой учетной записью сервиса.

(1) Это для Admin SDK , но эта статья содержит лучший пример. Вы заинтересованы в объекте учетных данных там. Вы также можете создать объект с помощью .json IIRC.

...