Как обновить токен Gmail API с истекшим сроком действия для приложения командной строки в Python 3? - PullRequest
0 голосов
/ 07 января 2019

Я разработал небольшой скрипт командной строки для отправки счетов с помощью API Gmail. Это работает, но время от времени срок действия токена истекает, и мне нужно перейти к облачным API, чтобы удалить токен и создать новый. Я хотел бы автоматизировать это. Вот ошибка, которую я получил сегодня при запуске скрипта:

    raise HttpAccessTokenRefreshError(error_msg, status=resp.status)
oauth2client.client.HttpAccessTokenRefreshError: invalid_grant: Token has been expired or revoked.

Я использую следующий процесс аутентификации, как описано в документации Gmail API для Python:

def main():
"""Shows basic usage of the Gmail API.
Lists the user's Gmail labels.
"""
store = 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('gmail', 'v1', http=creds.authorize(Http()))

Чтобы приведенный выше код работал, при первом использовании API вам понадобится файл credentials.json, затем откроется новая вкладка браузера и будет предложено авторизовать API Gmail. Как только это будет сделано, будет создан файл token.json. Я хотел бы создать исключение, которое обрабатывает срок действия токена и создает новое автоматически. Как добиться этого за минимально возможное количество строк кода?

1 Ответ

0 голосов
/ 07 января 2019

Обновление токена доступа (автономный доступ)

Срок действия токенов периодически истекает. Вы можете обновить токен доступа, не запрашивая у пользователя разрешения (в том числе, когда пользователь отсутствует), если вы запрашивали автономный доступ к областям, связанным с токеном.

Документация

authorization_url, state = flow.authorization_url(
    # Enable offline access so that you can refresh an access token without
    # re-prompting the user for permission. Recommended for web server apps.
    access_type='offline',
    # Enable incremental authorization. Recommended as a best practice.
    include_granted_scopes='true')
...