我正在尝试获取OAuth访问令牌以将一些数据导入融合表。我正在尝试使用Google API PHP客户端。我为此目的创建了一个服务帐户,并且正在使用代码,主要来自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()
来刷新基础访问令牌。如果使用客户端库发出签名请求,则在基础访问令牌已过期时,它将延迟地为你进行此调用。
刷新access_token的 API 请求成本高昂,并且配额较低,因此您需要缓存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 存储库中都有示例。