Пример учетной записи службы Google возвращает ошибку при обновлении токена OAuth2 { «error»: «invalid_grant»}

Моя цель — сделать простейший запрос к Google Fusion Tables от имени пользователей моего веб-приложения. Для этого я создал сервисный аккаунт в консоли Google. Вот код:

    // Creating a google client
    $client = new \Google_Client();


    // setting the service acount credentials
    $serviceAccountName = 'XXXXX.apps.googleusercontent.com';
    $scopes= array(
                'https://www.googleapis.com/auth/fusiontables',
                'https://www.googleapis.com/auth/fusiontables.readonly',
                );
    $privateKey=file_get_contents('/path/to/privatekey.p12');
    $privateKeyPassword='notasecret'; // the default one when generated in the console

    $credential = new \Google_Auth_AssertionCredentials($serviceAccountName,
            $scopes, $privateKey, $privateKeyPassword);

    // setting assertion credentials
    $client->setAssertionCredentials($credential);

    $service = new \Google_Service_Fusiontables($client);
    $sql = 'select name from XXXXXXXX'; 
    $result = $service->query->sql($sql);

После запуска этого кода я получил эту ошибку:

Error refreshing the OAuth2 token, message: '{
"error" : "invalid_grant"
}'

Я искал это в течение нескольких дней, и большинство ответов говорят об обновлении токена. Я сделал это обновление, но все те же ошибки!

Любая идея для решения этой проблемы? Спасибо


person Amine Jallouli    schedule 04.07.2014    source источник


Ответы (3)


В моем случае это было вызвано тем, что время сервера слишком далеко (около 5 минут).

Хотя ваша проблема уже решена, возможно, это поможет кому-то, кто попадет сюда в будущем, поскольку ошибка, возвращаемая Google, такая же.

person Bjorn    schedule 08.09.2014
comment
Как проверить, отличается ли мое машинное время. Пожалуйста помоги - person Bhupender Keswani; 09.10.2015
comment
@BhupenderKeswani Самый простой способ синхронизировать время вашего сервера — использовать NTP . Чтобы проверить текущее время на сервере, используйте команду date. - person Bjorn; 10.10.2015
comment
Вау, спасибо за совет, Бьорн. Я пробовал много других возможностей. :) - person Mino; 26.11.2015

Я знаю, что многие люди сталкиваются с такой же проблемой, как моя. Итак, это решение после нескольких дней поиска в Google.

В предложенном мной коде есть только одна ошибка: идентификатор клиента похож на электронное письмо, похожее на [email protected].

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

После этого вещь будет работать отлично.

Я надеюсь, что это поможет другим.

person Amine Jallouli    schedule 12.07.2014
comment
Я пытаюсь сделать что-то вроде этого: stackoverflow.com/questions/21470405/, и это дает мне ту же ошибку! - person Mike Warren; 17.11.2014
comment
Вы должны создать $client и сначала установить его учетные данные, а затем использовать SpreadsheetService - person Amine Jallouli; 17.11.2014
comment
amine jallouli, не могли бы вы уточнить это в качестве ответа на этот вопрос, который я только что задал: stackoverflow.com/questions/26965299/? - person Mike Warren; 17.11.2014
comment
Что вы подразумеваете под созданием $client? Какие методы я должен вызывать и каковы параметры? - person Mike Warren; 17.11.2014
comment
В своем вопросе я указал, как создать де \Google_Client(), затем \Google_Auth_AssertionCredentials и, наконец, \Google_Service_Fusiontables. Вы должны выполнить следующие шаги. В вашем случае вы будете использовать `Google\Spreadsheet\SpreadsheetService`. - person Amine Jallouli; 17.11.2014
comment
Я пытался использовать электронную почту своей учетной записи вместо электронной почты служебной учетной записи. Меняет мир! - person Jared Eitnier; 11.04.2015

У меня такая же ошибка в Google Analytics API. Я решил ее, добавив свой Service accounts Email address с учетной записью Google Analytics.

person Nishad Up    schedule 21.08.2015