Service Account経由で Analytics API にクエリを実行しています。
開発サーバーにコードを書きましたが、問題なく動作します。本番サーバーで同じコードを実行すると、次のようにスローされます。
Google_AuthException: OAuth2 トークンの更新中にエラーが発生しました。メッセージ: '{ "error" : "invalid_grant" }'
別のサービス アカウントを作成してみましたが、動作は同じです。
oAuth IETF ドラフト ( https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-31 ) は、エラーについて次のように述べています。
invalid_grant
The provided authorization grant (e.g. authorization
code, resource owner credentials) or refresh token is
invalid, expired, revoked, does not match the redirection
URI used in the authorization request, or was issued to
another client.
ここに私が書いたコードがあります:
$GA_CLIENT_ID = 'XX.apps.googleusercontent.com';
$GA_APP_EMAIL = 'XX@developer.gserviceaccount.com';
$GA_APP_NAME = 'XX';
$GA_KEY_FILE = 'XX';
// create client object and set app name
$client = new Google_Client();
$client->setApplicationName($GA_APP_NAME); // name of your app
// set assertion credentials
$client->setAssertionCredentials(
new Google_AssertionCredentials(
$GA_APP_EMAIL, // email you added to GA
array('https://www.googleapis.com/auth/analytics.readonly'),
file_get_contents($GA_KEY_FILE) // keyfile you downloaded
));
// other settings
$client->setClientId($GA_CLIENT_ID); // from API console
$client->setAccessType('offline_access'); // this may be unnecessary?
// create service and get data
$service = new Google_AnalyticsService($client);
$result = $service->data_ga->get($ids, $startDate, $endDate, $metrics, $optParams);
return $result;
Google_AnalyticsService の代わりに authenticatedRequest() を使用して、こちら ( https://groups.google.com/forum/?fromgroups#!topic/gs-discussion/3y_2XVE2q7U%5B1-25%5D )で提案されている解決策も試しました。
$req = new Google_HttpRequest($apiUrl);
$resp = $client::getIo()->authenticatedRequest($req);
$result = json_decode($resp->getResponseBody(), true);
この代替手段は開発サーバーでも機能しますが、運用サーバーでは機能しません。
私はこれについてまったく無知です。誰かがこれを見た/修正しましたか?
ありがとう!