Heim > Backend-Entwicklung > PHP-Tutorial > Wie behebe ich „invalid_grant'-Fehler beim Aktualisieren von Tokens mit der Google Analytics-API?

Wie behebe ich „invalid_grant'-Fehler beim Aktualisieren von Tokens mit der Google Analytics-API?

Linda Hamilton
Freigeben: 2024-12-08 14:02:11
Original
167 Leute haben es durchsucht

How to Resolve

Token mit Google API-Client aktualisieren

Bei der Verwendung der Google Analytics API (V3) können Benutzer auf Fehler stoßen, insbesondere beim Versuch, sie abzurufen Daten von anderen Konten als ihrem Testkonto. Dieses Problem manifestiert sich normalerweise als 403-Fehler. Darüber hinaus kann das Problem auch nach dem Widerrufen und erneuten Authentifizierung des Tokens nach Ablauf des Tokens erneut auftreten.

Um dieses Problem zu beheben, besteht die Lösung darin, die Methode „refreshToken“ zu verwenden, um ein neues Authentifizierungstoken zu erhalten. Allerdings kann die Ausführung von $client->refreshToken(refresh_token_key) zu einer ungültigen Gewährungsfehlermeldung („error“: „invalid_grant“) führen.

Bei der Untersuchung des Codes hinter der Methode „refreshToken“ wird Folgendes deutlich Parameter werden gesendet richtig:

  • client_id
  • client_secret
  • refresh_token
  • grant_type (hartcodiert als restart_token)

Die Das Verfahren zur Token-Aktualisierung ist wie folgt folgt:

$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
Nach dem Login kopieren

Der Schlüssel zur Lösung des Problems ist das Verständnis, dass dieses bei der Authentifizierung erhaltene anfängliche Token über ein Aktualisierungstoken verfügt. Während der ursprüngliche Token innerhalb einer Stunde abläuft, kann der Aktualisierungstoken genutzt werden, um einen neuen Token zu erhalten. Es ist jedoch wichtig zu beachten, dass auch dieses temporäre Token nach einer Stunde abläuft und kein Aktualisierungstoken zugeordnet ist. Um ein neues temporäres Token abzurufen, muss daher das Aktualisierungstoken des ursprünglichen Tokens verwendet werden.

Der Übersichtlichkeit halber bietet der folgende Code eine detaillierte Erklärung:

// 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);
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie behebe ich „invalid_grant'-Fehler beim Aktualisieren von Tokens mit der Google Analytics-API?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage