Я пытаюсь получить токен доступа OAuth для импорта некоторых данных в таблицу fusion. Я пытаюсь использовать клиент PHP API Google. Я создал учетную запись службы для этой цели и использую код, в основном из примера serviceAccount :
function access_token() { $client = new Google_Client(); $client->setAuthClass ('Google_OAuth2'); // ^ Don't know if this line is required, // ^ but it fails just as well without it. $client->setApplicationName ('Mysite.dom.ain'); $client->setAssertionCredentials (new Google_AssertionCredentials ( 'MANY-NUMBERS-LETTERS-DASHES@developer.gserviceaccount.com', array ('https://www.googleapis.com/auth/fusiontables'), file_get_contents ('path/to/my/privatekey.p12') )); $client->setClientId ('NUMBERS-LETTERS-DASHES.apps.googleusercontent.com'); $client->authenticate(); // ^ Also fails equally good with and without this line. return $client->getAccessToken(); }
Небольшой вывод отладки показывает, что $client->authenticate()
возвращает true
, но $client->getAcessToken()
возвращает значение null
. Никакие исключения не выбрасываются. У меня такое чувство, что я делаю что-то принципиально неправильное. Если да, пожалуйста, простите мою глупость и укажите мне в правильном направлении.
Вам не нужен вызов authenticate (), но вам нужно вызвать refreshTokenWithAssertion()
чтобы обновить базовый токен доступа. Если вы используете клиентскую библиотеку для выполнения подписанных запросов, она лениво сделает этот вызов для вас, если основной токен доступа истёк.
Запросы API для обновления access_token дороги и имеют низкую квоту, поэтому вам нужно кэшировать access_token.
// Set your client id, service account name, and the path to your private key. // For more information about obtaining these keys, visit: // https://developers.google.com/console/help/#service_accounts const CLIENT_ID = 'INSERT_YOUR_CLIENT_ID'; const SERVICE_ACCOUNT_NAME = 'INSERT_YOUR_SERVICE_ACCOUNT_NAME'; // Make sure you keep your key.p12 file in a secure location, and isn't // readable by others. const KEY_FILE = '/super/secret/path/to/key.p12'; $client = new Google_Client(); $client->setApplicationName("Google FusionTable Sample"); // Set your cached access token. Remember to store the token in a real database instead of $_SESSION. session_start(); if (isset($_SESSION['token'])) { $client->setAccessToken($_SESSION['token']); } $key = file_get_contents(KEY_FILE); $client->setAssertionCredentials(new Google_AssertionCredentials( SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/fusiontables'), $key) ); $client->setClientId(CLIENT_ID); if ($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion(); } // Get the json encoded access token. $token = $client->getAccessToken();
Я думаю, что все, что вы сделали, было правильным, теперь у вас есть два варианта:
$client
для вызова службы с чем-то подобным $service = new Google_FusiontablesService($client); $selectQuery = "select * from 1AwxQ46kfmPoYoq38e5CopJOWkCo_9GUU_ucD6zI"; $service->query->sql($selectQuery)
refreshTokenWithAssertion()
, чтобы получить свой токен: $client::$auth->refreshTokenWithAssertion(); $token = $client->getAccessToken(); //this should work now
Для обоих случаев у меня есть примеры в моем GitHub Repo.