1

Я работаю с этим пакетом Analytics-Laravel 4 для Google Analytics, и я правильно выполнил все шаги. Когда я пытаюсь получить идентификатор сайта, например, я сталкиваюсь эту ошибку:Ошибка обновления токена OAuth2, сообщение: '{"error": "invalid_grant"}'

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

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

+0

Попробуйте [upstream version] (https://github.com/thujohn/analytics-l4) пакета - вам может быть повезло больше. – luciddreamz

+0

@ luciddreamz У меня уже есть последняя версия. :/ – omarsafwany

ответ

1

Я не использовал этот пакет раньше, я использую 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 
} 

?> 
1

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

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

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

+0

Вы также можете настроить время в AssertionCredentials.php источника, изменив «$ now = time()» на «$ now = time() - $ offset», но оно будет перезаписано любыми обновлениями для источника – nbarth

+0

Я планирую сделать то, что вы сказали, но мне интересно, откуда вы взяли «$ offset»? – GianFS

Смежные вопросы