GMail API с использованием Python Google API Client: ошибка 400, предварительное условие не выполнено - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь получить доступ к нашему GSuite GMail API, используя Google API Python Клиент с аутентификацией учетной записи службы. Согласно документам, мой код MCVE выглядит следующим образом:

import os
import sys
from google.auth.transport.requests import Request
from google.oauth2.service_account import Credentials
from googleapiclient.discovery import build

email = sys.argv[1]

cred = Credentials.from_service_account_file(os.getenv('SERVICE_ACCOUNT'))
cred = cred.with_scopes(['https://www.googleapis.com/auth/gmail.labels'])
cred.refresh(Request())

gmail = build('gmail', 'v1', credentials=cred)
try:
    print(gmail.users().labels().list(userId=email).execute())
except Exception as ex:
    print('Error:', ex.content.decode('ascii'))

Вывод:

Error: {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "failedPrecondition",
    "message": "Bad Request"
   }
  ],
  "code": 400,
  "message": "Bad Request"
 }
}

Обычные подозреваемые:

  • Учетная запись службы предоставляется делегирование всего домена
  • Запрашиваемая электронная почта существует
  • Области клиента настроены в «Администратор> Безопасность> Дополнительно> Управление доступом клиента API»

access settings

Еще одно наблюдение: когда я получаю доступ к API, счетчик использования увеличивается для учетной записи службы, но остается равным 0 для соответствующего клиента OAuth2.

Что еще я могу отсутствовать?

1 Ответ

1 голос
/ 22 января 2020

Чего не хватало, так это один маленький кусочек, упомянутый в документации . В дополнение к настройке областей, мне нужно выдать себя за учетную запись пользователя, позвонив по номеру with_subject:

cred = cred.with_subject(email)

После этого все работает как положено, надеюсь, что это кому-нибудь поможет.

...