Google API クライアントによるトークンの更新
Google Analytics API (V3) の利用時、特に取得しようとしたときにエラーが発生する場合があります。テストアカウント以外のアカウントからのデータ。この問題は通常、403 エラーとして現れます。さらに、トークンを取り消して再認証した後でも、トークンの有効期限が切れると問題が再発する可能性があります。
この問題に対処する解決策は、refreshToken メソッドを利用して新しい認証トークンを取得することです。ただし、$client->refreshToken(refresh_token_key) を実行すると、無効な付与エラー メッセージ ("error" : "invalid_grant") が生成される場合があります。
refreshToken メソッドの背後にあるコードを調査すると、次のことが明らかになります。パラメータが送信される正しく:
トークンリフレッシュの手順は次のとおりです
$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 サイトの他の関連記事を参照してください。