API Google Analytics исключает исключение «invalid_grant» с учетной записью службы. Тот же код на двух серверах. Только один работает

Я запрашиваю API Google Analytics через учетную запись службы .

Я написал код на dev-сервере, и он работает без проблем. При запуске того же кода на производственном сервере он выдает следующее:

Ошибка Google_AuthException: ошибка обновления токена OAuth2, сообщение: '{"error": "invalid_grant"}'

Я пробовал создать еще одну учетную запись службы, и поведение остается прежним.

Проект oAuth IETF ( http://tools.ietf.org/html/draft-ietf-oauth-v2-31 ) говорит об ошибке:

invalid_grant The provided authorization grant (eg authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. 

Вот код, который я написал:

 $GA_CLIENT_ID = 'XX.apps.googleusercontent.com'; $GA_APP_EMAIL = 'XX@developer.gserviceaccount.com'; $GA_APP_NAME = 'XX'; $GA_KEY_FILE = 'XX'; // create client object and set app name $client = new Google_Client(); $client->setApplicationName($GA_APP_NAME); // name of your app // set assertion credentials $client->setAssertionCredentials( new Google_AssertionCredentials( $GA_APP_EMAIL, // email you added to GA array('https://www.googleapis.com/auth/analytics.readonly'), file_get_contents($GA_KEY_FILE) // keyfile you downloaded )); // other settings $client->setClientId($GA_CLIENT_ID); // from API console $client->setAccessType('offline_access'); // this may be unnecessary? // create service and get data $service = new Google_AnalyticsService($client); $result = $service->data_ga->get($ids, $startDate, $endDate, $metrics, $optParams); return $result; 

Я также попробовал решение, предлагаемое здесь ( https://groups.google.com/forum/?fromgroups#!topic/gs-discussion/3y_2XVE2q7U%5B1-25%5D ), используя authenticatedRequest () вместо Google_AnalyticsService:

 $req = new Google_HttpRequest($apiUrl); $resp = $client::getIo()->authenticatedRequest($req); $result = json_decode($resp->getResponseBody(), true); 

Эта альтернатива также работает на dev-сервере, но не на производственном.

Я совершенно не понимаю этого. Кто-нибудь видел это / исправил его?

Благодаря!

По-видимому, проблема заключалась в отключении системы. Работает путем синхронизации через NTP с:

sudo ntpdate npt.ubuntu.com

sudo ntpdate pool.ntp.org

редактировать

Как показано ниже, @RafaSashi, сервер pool.ntp.org более надежный. Используйте это вместо ntp.ubuntu.com (который был первым рабочим, который я пробовал, таким образом, первоначальным выбором) .

Недействительный грант также может быть вызван, если вы используете неправильный «ServiceAccountId». Это должно быть электронное письмо, связанное с идентификатором клиента, в идентификаторе клиента учетной записи службы на странице доступа google apis. Вам также придется добавить этого пользователя в учетную запись Google Analytics, к которой вы планируете получить доступ.

Это сработало, потому что я предположил, что адрес электронной почты, на который они ссылались, был адресом электронной почты моей учетной записи google, поскольку я использовал ту же учетную запись google, чтобы получить доступ к api, как и для Google Analytics. Я знаю, что Вир уже понял его, просто подумал, что добавлю это, если кто-то другой встретит один и тот же вопрос, и, как и я, их компьютер, похоже, синхронизирован с NTP.

В дополнение к ответу Валера:

Во-первых, вам нужно установить NTP, если он еще не установлен. Для Debian или Ubuntu это будет следующая команда:

 sudo apt-get install ntp 

Для Redhat или CentOS вам нужно будет использовать это:

 yum install ntp 

Если синхронизация через npt.ubuntu.com не работает, попробуйте:

 sudo ntpdate pool.ntp.org 

Ресурсы

Существуют две основные причины ошибки invalid_grant, которые вы должны позаботиться до запроса POST для обновления токена и токена доступа.

  1. Заголовок запроса должен содержать «content-type: application / x-www-form-urlencoded»
  2. Ваша полезная нагрузка запроса должна быть закодирована в форме данных формы, не отправлять как объект json.

В RFC 6749 OAuth 2.0 определяется значение invalid_grant как: предоставленный разрешающий разрешение (например, код авторизации, учетные записи владельца ресурса) или токен обновления недействителен, истек, отменен, не соответствует URI перенаправления, используемому в запросе авторизации, или был выдан другому клиенту ,

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

https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35

Google Playground – лучший инструмент, который поможет вам отправить запрос. https://developers.google.com/oauthplayground