9

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);

この代替手段は開発サーバーでも機能しますが、運用サーバーでは機能しません。

私はこれについてまったく無知です。誰かがこれを見た/修正しましたか?

ありがとう!

4

4 に答える 4

24

どうやら問題は、システム時間がオフになっていることでした。NTP 経由で同期することで機能しました:

sudo ntpdate npt.ubuntu.com

sudo ntpdate pool.ntp.org

編集

以下で @RafaSashi が示唆するように、pool.ntp.orgサーバーはより信頼性が高くなります。代わりにそれを使用してくださいntp.ubuntu.com (これは私が試した最初の作業であったため、最初の選択でした)

于 2012-08-16T00:30:10.647 に答える
2

Valerの答えに加えて:

まず、NTP がまだインストールされていない場合は、インストールする必要があります。Debian または Ubuntu の場合、次のコマンドになります。

sudo apt-get install ntp

Redhat または CentOS の場合は、次のものを使用する必要があります。

yum install ntp

同期npt.ubuntu.comが機能しない場合は、次を試してください。

sudo ntpdate pool.ntp.org

資力

于 2015-05-15T12:38:49.447 に答える
2

間違った「ServiceAccountId」を使用した場合にも、無効な許可が発生する可能性があります。これは、Google API アクセス ページのサービス アカウント クライアント ID のクライアント ID に関連付けられた電子メールである必要があります。また、アクセスする予定の Google アナリティクス アカウントにこのユーザーを追加する必要があります。

Google アナリティクスの場合と同じ Google アカウントを使用して API アクセスを取得したため、彼らが参照しているメール アドレスが私の Google アカウントのメール アドレスであると想定したため、これは私をつまずかせました。私は Vir がすでに彼のことを理解していることを知っています。他の誰かが同じ質問に出くわし、私のように、彼らのコンピューターが NTP と同期しているように見える場合に備えて、これを追加すると思いました。

于 2013-05-03T17:49:47.187 に答える