Как избежать «Не удалось получить токен доступа: {« error »:« invalid_grant »} в автономных задачах CAE cron?

Это сообщение является следующим: Как сделать операции access_type = offline / server-only OAuth2 на GAE / Python . Часть http = credentials.authorize(httplib2.Http()) больше не терпит неудачу при тестировании, но, похоже, она все еще работает при запуске с помощью cron GAE, где он не может обновить мой access_token :

  1. Я могу вручную запустить свою работу, позвонив /fetch , скажем, в 11:45.
  2. Планирование немедленного задания a /cronfetch в 11:55 работает тогда без какой- access_token проблемы access_token .
  3. Но потом я проснулся сегодня утром, увидев, что /cronfetch та же задача /cronfetch ( /cronfetch же, за исключением времени, которое в 01:00 для моей ежедневной задачи не тестировалось) не удалось:

     I 2013-06-10 05:53:51.324 make: Got type <class 'google.appengine.api.datastore_types.Blob'> I 2013-06-10 05:53:51.325 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> I 2013-06-10 05:53:51.327 URL being requested: https://www.googleapis.com/youtube/v3/playlists?alt=json&part=snippet%2Cstatus I 2013-06-10 05:53:51.397 Refreshing due to a 401 I 2013-06-10 05:53:51.420 make: Got type <class 'google.appengine.api.datastore_types.Blob'> I 2013-06-10 05:53:51.421 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> I 2013-06-10 05:53:51.421 Refreshing access_token I 2013-06-10 05:53:51.458 Failed to retrieve access token: { "error" : "invalid_grant" } I 2013-06-10 05:53:51.468 make: Got type <class 'google.appengine.api.datastore_types.Blob'> I 2013-06-10 05:53:51.468 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> I 2013-06-10 05:53:51.471 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> I 2013-06-10 05:53:51.471 get: Got type <class 'oauth2client.appengine.CredentialsModel'> E 2013-06-10 05:53:51.480 invalid_grant Traceback (most recent call last): File "/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in 

Это сообщение об ошибке «invalid_grant» в сообщении списка рассылки обновления токена (+ SO post 1 , SO post 2 , SO post 3 ) похоже на мою проблему, но похоже, что это происходит с помощью access_type=online . В моем случае я просто использую default access_type=offline , и я вижу, что «Выполнять эти операции, когда я не использую приложение» упоминать в первоначальном запросе на доступ.

Я только что перепланировал запуск cron в 08:25 (не заботясь о том, чтобы запустить ручную) с отладочными заявлениями о печати, которые я поручил GitHub для вас. Вот что я получаю, это похоже, но не идентично (обратите внимание, что несколько последних строк кажутся упорядоченными неправильно, я определенно не делаю OAuth2 в create_playlist пока не будут прочитаны все источники). Таким образом, игнорируя искаженный порядок (артефакт ведения журнала GAE?), Кажется, что мой запрос http = credentials.authorize(Http()) в create_playlist(self) , в настоящее время на строке 144 неверен:

  ... E 2013-06-10 08:26:12.817 http://www.onedayonemusic.com/page/2/ : found embeds ['80wWl_s-HuQ', 'kb1Nu75l1vA', 'kb1Nu75l1vA', 'RTWcNRQtkwE', 'RTWcNRQtkwE', 'ZtDXezAhes8', 'ZtDXezAhes8', 'cFGxNJhKK9c', 'cFGxNJhKK9c' I 2013-06-10 08:26:14.019 make: Got type <class 'google.appengine.api.datastore_types.Blob'> I 2013-06-10 08:26:14.020 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> I 2013-06-10 08:26:14.022 URL being requested: https://www.googleapis.com/youtube/v3/playlists?alt=json&part=snippet%2Cstatus I 2013-06-10 08:26:14.100 Refreshing due to a 401 I 2013-06-10 08:26:14.105 make: Got type <class 'google.appengine.api.datastore_types.Blob'> I 2013-06-10 08:26:14.106 validate: Got type <class 'oauth2client.client.OAuth2Credentials'> I 2013-06-10 08:26:14.106 Refreshing access_token E 2013-06-10 08:26:18.994 Deadline exceeded while waiting for HTTP response from URL: https://accounts.google.com/o/oauth2/token Traceback (most recent call last): File "/pyt E 2013-06-10 08:26:18.996 http://www.onedayonemusic.com/page/3/ : found embeds ['80wWl_s-HuQ', '6VNu2MLdE0c', '6VNu2MLdE0c', 'YwQilKbK9Mk', 'YwQilKbK9Mk', 'KYdB3rectmc', 'KYdB3 E 2013-06-10 08:26:18.996 crawl_videos end E 2013-06-10 08:26:18.996 create_playlist start E 2013-06-10 08:26:18.996 create_playlist got creds E 2013-06-10 08:26:18.996 create_playlist authorized creds 

→ Почему работа cron работает 5 минут после ручного запуска, но через 6 часов позже? Я думал, что токен обновления не истек. Что я делаю не так?

Заметьте, что это моя первая работа по GAE и моя вторая программа Python вообще, общий обзор кода / совет очень приветствуется, но, пожалуйста, будьте осторожны 🙂

Код находится на GitHub, и мой экземпляр можно найти на сайте dailygrooves.org . Спасибо за вашу помощь!

One Solution collect form web for “Как избежать «Не удалось получить токен доступа: {« error »:« invalid_grant »} в автономных задачах CAE cron?”

invalid_grant возвращается, когда токен обновления не может использоваться для получения нового токена доступа от текущего пользователя. Это происходит с вами, потому что хранимый объект Credentials имеет нулевой токен обновления, т.е.

 >>> credentials.refresh_token is None True 

Как указано в ПРИМЕЧАНИЕ в разделе Как сделать операции access_type = offline / server-only OAuth2 на GAE / Python? :

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

Вам необходимо убедиться, что ваши Credentials данные хранятся с действующим токеном обновления и самым простым способом сделать это, как указано в последнем вопросе, а также во всех трех вопросах, которые вы OAuth2WebServerFlow заключается в использовании OAuth2WebServerFlow approval_prompt=force при создании OAuth2WebServerFlow или OAuth2Decorator объект (в зависимости от того, что вы используете).

  • Установленное приложение Python и идентификатор клиента Google
  • python & smtplib: отправляет почту через gmail с помощью oauth2?
  • Python - проблемы с доступом к электронной таблице Google с использованием сервисного клиента OAuth 2.0
  • Вход в Google+ - поток на стороне сервера - Python - Google App Engine
  • Как отправить POST с помощью 2-legged oauth2 в python?
  • Пример командной строки Google OAuth2
  • API настроек администратора с oauth2 в gdata и python
  • Как добавить поставщиков OAuth 2.0?
  • AppIdentityError: неправильный получатель при проверке токена
  • Django Tastypie POST Неавторизованный на разных серверах
  • Использовать OAuth2 для аутентификации + совместимость с сервисом google.appengine.api.users
  •  
    Interesting Posts for Van-Lav

    python: конвертировать дату timestamp в эпоху unix time и выяснить количество оставшихся дней?

    Может ли EXE, сгенерированный cx_freeze, полностью декомпилироваться обратно в считываемый код Python?

    Вопросы о большой картине, касающиеся Django, Java, Python, HTML и разработки веб-сайтов в целом

    Python: ярлык для написания декораторов, которые принимают аргументы?

    Получить последнее время доступа к файлу?

    Flask-SQLAlchemy – Когда создаются и уничтожаются таблицы / базы данных?

    Определенный способ сопоставления Stata с взвешенной командой xtile с использованием Python?

    Контрольная сумма python md5 с argv, вызванным из main.py

    Force pyplot.imshow () для создания изображения с более высоким разрешением

    Рекурсия Python max, вопрос о sys.setrecursionlimit ()

    Какие хорошие уроки домашнего урока рекомендуется для изучения функционального программирования на Python?

    Как я могу проверить, содержит ли строка юникода Python незападные буквы?

    Ссылка на словарь Python на соседний словарь

    Доступ к нескольким клавиатурам, введенным C ++ (или python) в Linux

    Ошибка UnicodeDecodeError при записи файла .xlsx с помощью xlsxwriter

    Python - лучший язык программирования в мире.