Токен доступа и токен обновления, предоставляющий недействительный грант в Google Plus на Python?

Я правильно просматриваю офлайн-доступ и сохраняю это. Каждые 60 минут, когда это необходимо, я получаю новый access_token. Код не изменился, но странно то, что когда он впервые прошел авторизацию.

client_id ="xxxxx.apps.googleusercontent.com" client_secret ="xxxxxxxxxxxxxxxxxxxx" refresh_token ="xxxxxxxxxxxxxxxxxxx" response = oauth2a.RefreshToken(client_id,client_secret,refresh_token) def RefreshToken(client_id, client_secret, refresh_token): params = {} params['client_id'] = client_id params['client_secret'] = client_secret params['refresh_token'] = refresh_token params['grant_type'] = 'refresh_token' request_url = AccountsUrl('o/oauth2/token') response = urllib.urlopen(request_url, urllib.urlencode(params)).read() return json.loads(response) 

Ответ всегда {u'error ': u'invalid_grant'}. Я попытался это на трех разных машинах, а также Get HTTPError: Ошибка HTTP 400: Плохой запрос

  • Вход в Google+ - поток на стороне сервера - Python - Google App Engine
  • Google API: получение учетных данных из токена обновления с помощью oauth2client.client
  • Спасибо

  • Python API Диска Google - список всего дерева файлов дисков
  • Поиск в Google с помощью Python
  • Как получить доступ (чтение, запись) к таблицам Google Таблиц с помощью Python?
  • Google API Python unauthorized_client: неавторизованный клиент или область в запросе
  • Как выполнять операции, требующие OAuth, в работе GAE cron?
  • Как избежать «Не удалось получить токен доступа: {« error »:« invalid_grant »} в автономных задачах CAE cron?
  • 5 Solutions collect form web for “Токен доступа и токен обновления, предоставляющий недействительный грант в Google Plus на Python?”

    Ошибка invalid_grant имеет две распространенные причины.

    1. Часы вашего сервера не синхронизируются с NTP . (Решение: проверьте время сервера, если его неправильно исправить.)
    2. Предел токена обновления превышен. (Решение: ничего, что вы можете сделать, они не могут иметь больше токенов обновления). Приложения могут запрашивать несколько токенов обновления. Например, это полезно в ситуациях, когда пользователь хочет установить приложение на нескольких машинах. В этом случае требуются два токена обновления, по одному для каждой установки. Когда количество токенов обновления превышает предел, старшие токены становятся недействительными. Если приложение пытается использовать недействительный токен обновления, возвращается ответ об ошибке invalid_grant. Предел для каждой уникальной пары клиента OAuth 2.0 и 25 обновленных токенов (обратите внимание, что этот предел может быть изменен). Если приложение продолжает запрашивать токены обновления для одной и той же пары Client / Account, после того, как будет выпущен 26-й токен, первый токен обновления, который был ранее выпущен, станет недействительным. 27-й запрошенный токен обновления приведет к недействительности второго ранее выпущенного токена и так далее.

    Возможно, вам захочется попробовать подход, используемый в образце Google+ Python Hybrid auth, и позволить библиотеке управлять токенами OAuth 2. Полный пример:

    https://developers.google.com/+/quickstart/python

    В этом примере обмен кодами выполняется с использованием библиотеки Google, и учетные данные хранятся в базовом сеансе с успехом (вы должны использовать БД на практике):

     # Retrieve authorization code from POST data code = request.data try: # Upgrade the authorization code into a credentials object oauth_flow = flow_from_clientsecrets('client_secrets.json', scope='') oauth_flow.redirect_uri = 'postmessage' credentials = oauth_flow.step2_exchange(code) except FlowExchangeError: response = make_response( json.dumps('Failed to upgrade the authorization code.'), 401) response.headers['Content-Type'] = 'application/json' return response #... other code ... session['credentials'] = credentials 

    Позже вы можете просто получить учетные данные (из сеанса или db), а библиотека Python сделает все остальное.

     """Get list of people user has shared with this app.""" credentials = session.get('credentials') # Only fetch a list of people for connected users. if credentials is None: response = make_response(json.dumps('Current user not connected.'), 401) response.headers['Content-Type'] = 'application/json' return response try: # Create a new authorized API client. http = httplib2.Http() http = credentials.authorize(http) # Get a list of people that this user has shared with this app. google_request = SERVICE.people().list(userId='me', collection='visible') result = google_request.execute(http=http) response = make_response(json.dumps(result), 200) response.headers['Content-Type'] = 'application/json' return response except AccessTokenRefreshError: response = make_response(json.dumps('Failed to refresh access token.'), 500) response.headers['Content-Type'] = 'application/json' return response 

    У меня была такая же проблема (Windows OS). и я исправил это, просто обновив синхронизацию времени сервера, и теперь он отлично работает.

    введите описание изображения здесь

    У меня была аналогичная проблема, и я получил ответ «invalid_grant». Оказывается, я делал начальный вызов OAuth с помощью grant_type = "client_credentials", и я должен был использовать его с помощью grant_type = "password". Хотел разделить решение, которое сработало для меня.

    Дополнительное объяснение между типами grant_types можно найти ниже

    Разница между grant_type = client_credentials и grant_type = password в потоке аутентификации?

    Узнав, что перенаправление OAuth2 возвращается без обновления токена, я нашел, что мое исправление находится в этом потоке https://github.com/google/google-api-python-client/issues/213 . Подводя итоги, добавьте prompt = 'consent' на обменный поток:

     flow.params['prompt'] = 'consent' 
    Python - лучший язык программирования в мире.