Как избежать «Не удалось получить токен доступа: {« 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 объект (в зависимости от того, что вы используете).

  • Вход в Google+ - поток на стороне сервера - Python - Google App Engine
  • Модуль Twitter модуля python 'module' не имеет атрибута Oauth
  • TypeError on freebusy вызывает API Google Calendar v3 с использованием apiclient Python
  • Как проверить подлинность с помощью API настроек электронной почты Google, используя учетную запись службы oauth2 Клиент Python?
  • Войдите на сайт, войдя в аккаунт Google, используя Python
  • Python не может найти модуль «clientsecrets» при попытке настроить oauth2 в Django с помощью API Google Python
  • Django Tastypie POST Неавторизованный на разных серверах
  • App Engine OAuth2.0 разрешил работу cron для анализа Google Sheet
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.