ホームページ > バックエンド開発 > PHPチュートリアル > Google Analytics APIでトークンを更新する際の「invalid_grant」エラーを解決するにはどうすればよいですか?

Google Analytics APIでトークンを更新する際の「invalid_grant」エラーを解決するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-08 14:02:11
オリジナル
175 人が閲覧しました

How to Resolve

Google API クライアントによるトークンの更新

Google Analytics API (V3) の利用時、特に取得しようとしたときにエラーが発生する場合があります。テストアカウント以外のアカウントからのデータ。この問題は通常、403 エラーとして現れます。さらに、トークンを取り消して再認証した後でも、トークンの有効期限が切れると問題が再発する可能性があります。

この問題に対処する解決策は、refreshToken メソッドを利用して新しい認証トークンを取得することです。ただし、$client->refreshToken(refresh_token_key) を実行すると、無効な付与エラー メッセージ ("error" : "invalid_grant") が生成される場合があります。

refreshToken メソッドの背後にあるコードを調査すると、次のことが明らかになります。パラメータが送信される正しく:

  • client_id
  • client_secret
  • refresh_token
  • grant_type (refresh_token としてハードコードされています)

トークンリフレッシュの手順は次のとおりです

$client = new apiClient();
$client->setClientId($config['oauth2_client_id']);
$client->setClientSecret($config['oauth2_client_secret']);
$client->setRedirectUri($config['oauth2_redirect_uri']);
$client->setScopes('https://www.googleapis.com/auth/analytics.readonly');
$client->setState('offline');

$client->setAccessToken($config['token']); // The access JSON object.

$client->refreshToken($config['refreshToken']); // Will return error here
ログイン後にコピー

問題を解決する鍵は、認証時に取得されたこの初期トークンがリフレッシュ トークンを所有していることを理解することです。最初のトークンは 1 時間以内に期限切れになりますが、リフレッシュ トークンを利用して新しいトークンを取得できます。ただし、この一時トークンも 1 時間後に期限切れになり、関連付けられた更新トークンがないことに注意することが重要です。したがって、新しい一時トークンを取得するには、初期トークンのリフレッシュ トークンを使用する必要があります。

わかりやすくするために、次のコードで詳細な説明を示します。

// Retrieve original token from database
$tokenquery = "SELECT * FROM token WHERE type='original'";
$tokenresult = mysqli_query($cxn, $tokenquery);
if ($tokenresult != 0) {
    $tokenrow = mysqli_fetch_array($tokenresult);
    extract($tokenrow);
}
$time_created = json_decode($token)->created;
$t = time();
$timediff = $t - $time_created;

$refreshToken = json_decode($token)->refresh_token;

// Initialize Google client
$client = new Google_Client();
$client->setApplicationName('');
$client->setScopes(array());
$client->setClientId('');
$client->setClientSecret('');
$client->setRedirectUri('');
$client->setAccessType('offline');
$client->setDeveloperKey('');

// Refresh token if expired
if (($timediff > 3600) && ($token != '')) {
    $refreshquery = "SELECT * FROM token WHERE type='refresh'";
    $refreshresult = mysqli_query($cxn, $refreshquery);

    // If refresh token exists
    if ($refreshresult != 0) {
        $refreshrow = mysqli_fetch_array($refreshresult);
        extract($refreshrow);
        $refresh_created = json_decode($token)->created;
        $refreshtimediff = $t - $refresh_created;

        // If refresh token is also expired
        if ($refreshtimediff > 3600) {
            $client->refreshToken($refreshToken);
            $newtoken = $client->getAccessToken();
            $tokenupdate = "UPDATE token SET token='$newtoken' WHERE type='refresh'";
            mysqli_query($cxn, $tokenupdate);
            $token = $newtoken;
            echo "refreshed again";
        } else {
            $client->setAccessToken($token);
            echo "use refreshed token but not time yet";
        }
    } else {
        $client->refreshToken($refreshToken);
        $newtoken = $client->getAccessToken();
        $tokenupdate = "INSERT INTO token (type, token) VALUES ('refresh', '$newtoken')";
        mysqli_query($cxn, $tokenupdate);
        $token = $newtoken;
        echo "refreshed for first time";
    }
}

// If token is still valid
if (($timediff < 3600) && ($token != '')) {
    $client->setAccessToken($token);
}

$service = new Google_DfareportingService($client);
ログイン後にコピー

以上がGoogle Analytics APIでトークンを更新する際の「invalid_grant」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート