Как хранить Oath2 Token, чтобы не запрашивать согласия пользователя при каждом запуске программы - PullRequest
0 голосов
/ 04 мая 2019

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

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

Я несколько часов копался в поиске решения этой проблемы, которое использует идентификатор клиента, а не служебную учетную запись (поэтому программа всегда получает доступ к учетной записи Google пользователя, а не к общедоступной) и может подключиться к безуспешно.

Я предполагаю, что то, что я хочу, возможно, поскольку руководство по быстрому запуску API листов Google для python работает именно так, как мне нужно, за исключением того, что я не знаю, как подключить его к gspread, который является необходимой библиотекой для этого проекта.

Что у меня сейчас есть и работает:


#Import libraries
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run_flow, argparser
from oauth2client.file import Storage
from oauth2client.client import AccessTokenCredentials
import requests
import gspread, ast

#Setup Oauth2
CLIENT_ID = '<Client ID>'
CLIENT_SECRET = '<Client Secret>'
flow = OAuth2WebServerFlow(client_id=CLIENT_ID,
                           client_secret=CLIENT_SECRET,
                           scope='https://spreadsheets.google.com/feeds',
                           redirect_uri='http://localhost:8080/')
storage = Storage('mycredentials.data')


credentials = run_flow(flow, storage, argparser.parse_args([]))

#Attempt login

data = {
    'refresh_token' : credentials.refresh_token,
    'client_id' : credentials.client_id,
    'client_secret' : credentials.client_secret,
    'grant_type' : 'refresh_token',
}
r = requests.post('https://accounts.google.com/o/oauth2/token', data = data)

credentials.access_token = ast.literal_eval(r.text)['access_token']

gc = gspread.authorize(credentials)

Однако, как указано выше, пользователь будет запрашивать разрешение каждый раз, когда он запускается, я бы хотел, чтобы он "сохранил" это разрешение, чтобы избежать его при запуске в будущем.

...