Google API возвращает invalid_grant в производство, но не локально

У меня очень странное исключение, использующее API google в python. Цель состоит в проверке на стороне сервера действительности маркера, соответствующего подписке в приложении от приложения Android.

Итак, для этого у нас есть учетная запись службы, прикрепленная к нашей учетной записи Google Play, и мы пытаемся аутентифицировать наш запрос, используя oauth через ключ p12 (преобразованный в сертификат pem для удаления фразы):

from apiclient.discovery import build
from httplib2 import Http
from oauth2client.client import SignedJwtAssertionCredentials

with open("googleplay.pem") as f:
    private_key = f.read()
credentials = SignedJwtAssertionCredentials(GOOGLE_CLIENT_EMAIL, private_key, scope=['https://www.googleapis.com/auth/androidpublisher'])
http_auth = credentials.authorize(Http())
client = build('androidpublisher', 'v2', http=http_auth)

И это отлично работает на моем компьютере. Но последняя строка вызывает исключение на моих серверах: invalid_grant

Я не понимаю, откуда это может произойти! Если вы можете помочь нам с этим, это было бы замечательно!

некоторый дополнительный код, который я использовал для преобразования сертификата p12 в сертификат pem:

openssl pkcs12 -in privatekey.p12 -nodes -nocerts > privatekey.pem

Затем я удалил первые 4 строки.

Спасибо заранее!

Ответ 1

Не уверен, что это поможет дать вам какие-либо подсказки.

Недавно я исправил проблему с похожим сообщением об ошибке (также содержит "invalid_grant" ). Мое дело было связано с отсутствием значения refresh_token в учетных данных OAuth2, что приводит к обновлению обновленных учетных данных. Таким образом, я исправился, чтобы получить новый токен обновления от google. Оказывается, google только распространяет обновление в первый раз, когда пользователь авторизуется с Google. Если пользователь не отключит приложение и не выполнит авторизацию. Или в приложении устанавливается flow.params['approval_prompt'] = 'force' (обычно для локальной отладки).

В моем случае речь идет о учетных данных для веб-приложений и авторизации OAuth2. Ваш выглядит как учетная запись службы, поэтому я не уверен, что ваша проблема также является проблемой обновления.

Ответ 2

У меня была точно такая же проблема.

Я исправил это, синхронизируя системное время, используя NTP

Это будет работать только на корневом сервере. Не на виртуальном сервере. Обратитесь к поставщику хостинга вашего сервера, если вы арендуете vServer.

Надеюсь, это поможет:)