Ошибка при обновлении токена OAuth2, сообщение: '{ ошибка : invalid_grant }'

Я работаю с этим пакетом Analytics-Laravel 4 для аналитики Google и следую всем шагам правильно. Например, когда я пытаюсь получить идентификатор сайта, я сталкиваюсь с этой ошибкой:

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

Я дважды проверил все конфигурации, идентификатор клиента, service_account и закрытый ключ, но ошибка все еще возникает. Что-нибудь еще, что я должен попытаться проверить, возможно, решит эту проблему?!


person omarsafwany    schedule 19.11.2014    source источник
comment
Попробуйте первоначальную версию пакета — возможно, вам повезет больше.   -  person luciddreamz    schedule 20.11.2014
comment
@luciddreamz у меня уже есть последняя версия. :/   -  person omarsafwany    schedule 20.11.2014


Ответы (2)


Я не использовал этот пакет раньше, я использую google-api-php-client, но в любом случае эта ошибка возникает, если вы не установили токен обновления.

Вы должны знать, что вам нужно иметь токен доступа ТОЛЬКО один раз. Вам также необходимо установить автономный тип доступа, который предоставит вам токен обновления, который вы будете использовать для автоматического получения нового токена доступа без получения нового кода каждый раз, когда срок действия вашего токена доступа истечет.

В консоли Google я создал Идентификатор клиента для веб-приложения. Убедитесь, что вы установили URI перенаправления на свою веб-страницу, где вы получите код и извлечете токен доступа, используя этот код.

Вот пример кода с использованием google-api-php-client, надеюсь, поможет:

Вам нужно запустить следующий код только один раз, а затем получить и сохранить токен доступа.

<?php

require_once('google-api-php-client-master/src/Google/Client.php');

session_start();

$client = new Google_Client();
$client->setApplicationName('APP_NAME');

$client->setClientId(YOUR_CLIENT_ID);
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('YOUR_REDIRECT_URI');
$client->setDeveloperKey('YOUR_DEV_KEY');
$client->setScopes(array('https://www.googleapis.com/auth/analytics.readonly'));
$client->setAccessType("offline");

// Step 1: Create an auth url
if (isset($_GET['ref']) && $_GET['ref'] == "1") {
    $authUrl = $client->createAuthUrl();
    return Redirect::to($authUrl);
}   

// Step 2: The user accepted your access now you need to exchange it.
if (isset($_GET['code'])) {
    $client->authenticate($_SESSION['code']);  //Authenticate the client
    $token = $client->getAccessToken();  //Get the access token
    var_dump($token); //Store the token in your DB or config file
    die();
}

?>

Получив токен доступа из приведенного выше кода (который должен содержать токен обновления), сохраните его в своей базе данных или в файле конфигурации.

Теперь следующий код должен аутентифицировать клиента и обновлять токен доступа по истечении срока его действия с помощью функции getAccessToken.

<?php

require_once('google-api-php-client-master/src/Google/Client.php');
require_once('google-api-php-client-master/src/Google/Service/Analytics.php');

$client = new Google_Client();
$client->setApplicationName('APP_NAME');

$client->setClientId(YOUR_CLIENT_ID);
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('YOUR_REDIRECT_URI');
$client->setDeveloperKey('YOUR_DEV_KEY');
$client->setScopes(array('https://www.googleapis.com/auth/analytics.readonly'));
$client->setAccessType("offline"); //Make sure the access type is offline to get a refresh token

$config = CoreConfig::find(1); //Getting the first record from the config table
$client->setAccessToken($config->google_access_token); //Retrieve the access token that you stored and set it to the client object

//Check this the token is expired
if($client->isAccessTokenExpired()) {
    $token = json_decode($config->google_access_token, true); //Get the token stored, and convert JSON to array
    $client->refreshToken($token['refresh_token']); //Set the refresh token
    $newtoken = $client->getAccessToken(); //Call the getAccessToken() function to get a new access token for you
    $config->update(array('google_access_token' => $newtoken)); //Store the new token in your DB
}

if ($client->getAccessToken()) {
    $analytics = new Google_Service_Analytics($client);
    //Do something with the $analytics object
}

?>
person Mohammed Radwan    schedule 27.11.2014

Это может быть серверное время. Если местное время на вашем сервере не синхронизировано с сервером oAuth Google даже на несколько секунд, вы получите это сообщение об ошибке.

Вы можете проверить время, запустив «date» в консоли.

Запуск «sudo ntpdate ntp.ubuntu.com» решил эту проблему для нас.

person nbarth    schedule 20.03.2015
comment
Вы также можете настроить время в AssertionCredentials.php источника, изменив $now = time() на $now = time() - $offset, но оно будет перезаписано при любых обновлениях источника. - person nbarth; 20.03.2015
comment
Я собираюсь сделать то, что вы сказали, но мне интересно, где вы взяли $offset? - person GianFS; 05.06.2015