Как обновить токен аутентификации с помощью Authlib и GSpread? - PullRequest
1 голос
/ 03 октября 2019

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

Я не могу понять, как обновить токен с помощью authlib, поэтому мы выбрали библиотеку, потому что она интегрирована с gspread и должна была автоматически обновлять токены auth для вас. Код, который я использую для входа в систему, приведен ниже, но через час не удается выполнить стандартную функцию open_by_key() из-за проблемы аутентификации.

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

creds = OAuth2Session(clientId, clientSecret, scope=scope, redirect_uri=redirectUrl)
authUrl, state = creds.create_authorization_url('https://accounts.google.com/o/oauth2/v2/auth', response_type='token')

Загрузите authURL в браузере изаставить пользователя войти в систему. Браузер возвращает ответ аутентификации как urlString

creds.fetch_access_token(authorization_response=urlString)

gc = gspread.Client(None, creds)
ss = gc.open_by_key(sheetKey)
todaysSheetName = datetime.datetime.now().strftime('%d-%m-%Y')
wks = ss.worksheet(todaysSheetName)

1 Ответ

0 голосов
/ 09 октября 2019
authUrl, state = creds.create_authorization_url('https://accounts.google.com/o/oauth2/v2/auth', response_type='token')

Согласно этому коду, который вы используете, response_type=token - это неявный поток типа предоставления. Я предполагаю, что в токене не будет refresh_token с неявным потоком. Вот мои предложения:

  1. попробуйте изменить его на поток кода авторизации
  2. использовать базу данных для сохранения токенов
  3. если токен истек, используйте ранее сохраненный токенrefresh_token для обмена новым токеном.

Метод refresh_token прост:

refresh_token(url=None, refresh_token=None, body='', auth=None, headers=None, **kwargs)

Используя ваш код, оно должно быть:

refresh_token = your_previous_token.refresh_token
new_token = creds.refresh_token('https://accounts.google.com/...', refresh_token=refresh_token)

Проблема в том, что по этой части нет документации. Но в соответствии с API, он будет использоваться следующим образом. Если он не работает, вы можете сообщить об этом в систему отслеживания проблем Authlib.

...