Как создать сервис Google API с помощью google-auth?

1

Я пытаюсь заполнить листок Google из программы Python с помощью своего API, используя в качестве отправной точки руководство по быстрому старту (https://developers.google.com/sheets/api/quickstart/python):

from __future__ import print_function
from apiclient.discovery import build
from httplib2 import Http
from oauth2client import file as oauth_file, client, tools

# Setup the Sheets API
SCOPES = 'https://www.googleapis.com/auth/spreadsheets.readonly'
store = oauth_file.Storage('token.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
    creds = tools.run_flow(flow, store)
service = build('sheets', 'v4', http=creds.authorize(Http()))

Тем не менее, мне удалось заставить это работать, используя метод flow_from_clientsecrets(), который (по умолчанию) открывает страницу проверки подлинности в браузере. Это не похоже на то, что я хотел бы периодически запускать на производственном сервере.

В любом случае, согласно https://pypi.org/project/oauth2client/, oauth2client устарел, и разработчикам рекомендуется вместо этого использовать google-auth.

Поэтому я попытался адаптировать этот пример следующим образом (следуя https://google-auth.readthedocs.io/en/latest/user-guide.html#service-account-private-key-files):

from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(
    'google_client_secret.json')

Где 'google_client_secret.json' - это файл JSON, загруженный с консоли API, который выглядит так (скремблированный и довольно печатный):

{
  "installed": {
    "client_id": "33e.apps.googleusercontent.com",
    "project_id": "nps-survey-1532981793379",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_secret": "foobar",
    "redirect_uris": [
      "urn:ietf:wg:oauth:2.0:oob",
      "http://localhost"
    ]
  }
}

Однако, когда я запускаю сценарий, я получаю следующую ошибку:

(lucy-web-CVxkrCFK) bash-3.2$ python nps.py
Traceback (most recent call last):
  File "nps.py", line 25, in <module>
    'google_client_secret.json')
  File "/Users/kurtpeek/.local/share/virtualenvs/lucy-web-CVxkrCFK/lib/python3.7/site-packages/google/oauth2/service_account.py", line 209, in from_service_account_file
    filename, require=['client_email', 'token_uri'])
  File "/Users/kurtpeek/.local/share/virtualenvs/lucy-web-CVxkrCFK/lib/python3.7/site-packages/google/auth/_service_account_info.py", line 73, in from_filename
    return data, from_dict(data, require=require)
  File "/Users/kurtpeek/.local/share/virtualenvs/lucy-web-CVxkrCFK/lib/python3.7/site-packages/google/auth/_service_account_info.py", line 51, in from_dict
    'fields {}.'.format(', '.join(missing)))
ValueError: Service account info was not in the expected format, missing fields token_uri, client_email.

От отказа от отладчика я заметил, что проблема в основном заключается в том, что словарь, переданный в метод from_dict() - это весь словарь в файле google_client_secret.json, который имеет только один ключ "installed". То, что from_dict() кажется, "ищет", является под-словарем, поскольку в нем содержится ключ token_uri, хотя даже это не содержит требуемый ключ client_email.

Я подозреваю, что я создал неверный тип клиента OAuth2 для моего варианта использования, поскольку JSON, содержащий секреты клиента, не находится в ожидаемом формате. Любые идеи, как я мог это исправить?

Теги:
google-api
google-sheets-api
google-oauth
google-authentication

1 ответ

1
Лучший ответ

Из https://developers.google.com/api-client-library/python/guide/aaa_oauth существует три типа идентификаторов клиентов:

  1. Идентификаторы клиентов веб-приложений
  2. Установленные идентификаторы клиента приложения
  3. Идентификаторы клиента учетной записи службы

Мой вариант использования - это учетная запись службы, и, создав ее, и выбрав опцию Furnish для нового частного ключа, я обнаружил, что получил файл JSON, который соответствует ожидаемому формату. (Тот, который у меня был, был для установленного приложения).

  • 1
    @ tehhowch, я полагаю, вы имеете в виду, я должен выполнить пункт 2: принять ответ? StackOverflow позволяет вам принять ваш собственный ответ только после истечения определенного периода; в моем случае я могу принять это только завтра. Я сделаю это тогда.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню