Как мне настроить аутентификацию в Google Sheets без запроса авторизации моего скрипта?

#python #google-sheets #authorization #google-sheets-api #google-api-python-client

#python #google-sheets #авторизация #google-sheets-api #google-api-python-client

Вопрос:

Я пытаюсь запросить Google Sheets через их API с использованием Python и немного запутался при настройке. Используя их руководство по документации, я аутентифицировался сам и получил JSON-файл с идентификатором клиента OAuth 2.0, который я загрузил, и одобрил доступ к моему приложению, что соответствует моему скрипту, верно?

Однако каждый раз, когда я запускаю свой скрипт, мне продолжают предлагать авторизовать мое приложение. Я запускаю скрипт, и он автоматически открывает страницу в моем браузере на странице, похожей на страницу входа в Google, где он спрашивает, хочу ли я, чтобы Quickstart получил доступ к вашей учетной записи Google

Я скопировал часть авторизации непосредственно с этой страницы, но не знаю, что изменить или сделать на их странице API и сервисов, чтобы это работало без проблем

 SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

if os.path.exists("token.pickle"):
    with open("token.pickle", 'rb') as token:
        creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file("googlesheetscreds.json",
                                                         SCOPES)
        creds = flow.run_local_server()
    # Save the credentials for the next run
    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)
  

Нужно ли мне изменять области?

Комментарии:

1. Какие виды учетных данных вы запросили? Если они не предоставляют автономный доступ, то вы не сможете выполнить без перепрошивки. (т. Е. вы проверили удаленные creds , чтобы увидеть, разрешают ли они обновление?)

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

3. Хм, итак, первым набором учетных данных был идентификатор клиента OAuth 2.0, и я прошел через мастер, чтобы создать другой набор, который в итоге стал ключом учетной записи службы, который не работает. Теперь я получаю эту ошибку: ValueError: Client secrets must be for a web or installed app.

4.@simplycoding При googlesheetscreds.json изменении файла учетной записи службы ваш скрипт должен быть изменен для использования учетной записи службы, подобной credentials = service_account.Credentials.from_service_account_file("### JSON file of Service Account ###", scopes=SCOPES) service = build(serviceName='sheets', version='v4', credentials=credentials) . Я разместил в качестве комментария, потому что я не уверен, хотите ли вы использовать учетную запись службы. Если я неправильно понял вашу ситуацию, я приношу извинения.

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

Ответ №1:

Похоже, вы хотите использовать учетную запись службы, вам следует вернуться в свою облачную консоль Google, настроить ее и загрузить новый файл JSON.

Документация Google о типах учетных данных и о том, как их настроить, здесь

Затем вы должны изменить свой код, чтобы он загружался и запускался с учетными записями служб вместо обычного oauth, проблема в «InstalledAppFlow», вот полный код:

 import os.path
import pickle

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


def create_credential():
    if os.path.exists("token.pickle"):
        with open("token.pickle", 'rb') as token:
            creds = pickle.load(token)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            # flow = InstalledAppFlow.from_client_secrets_file("googlesheetscreds.json", SCOPES)
            # creds = flow.run_local_server()
            creds = service_account.Credentials.from_service_account_file('googlesheetscreds.json')
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    service = build('sheets', 'v4', credentials=creds)

    # Tip: return the spreadsheet already created and re-use it along with your code, 
    # if you create a new one in every request it will leak around 30MB each time
    return service.spreadsheets()