Maison >développement back-end >tutoriel php >Comment résoudre les erreurs « invalid_grant » lors de l'actualisation des jetons avec l'API Google Analytics ?

Comment résoudre les erreurs « invalid_grant » lors de l'actualisation des jetons avec l'API Google Analytics ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-08 14:02:11164parcourir

How to Resolve

Jeton d'actualisation avec le client API Google

En utilisant l'API Google Analytics (V3), les utilisateurs peuvent rencontrer des erreurs, en particulier lorsqu'ils tentent de récupérer données provenant de comptes autres que leur compte de test. Ce problème se manifeste généralement par une erreur 403. De plus, même après avoir révoqué et réauthentifié le jeton, le problème peut réapparaître à l'expiration du jeton.

Pour résoudre ce problème, la solution réside dans l'utilisation de la méthode rafraîchirToken pour obtenir un nouveau jeton d'authentification. Cependant, l'exécution de $client->refreshToken(refresh_token_key) peut produire un message d'erreur d'octroi non valide ("error" : "invalid_grant").

En examinant le code derrière la méthode rafraîchirToken, il devient évident que ce qui suit les paramètres sont envoyés correctement :

  • client_id
  • client_secret
  • refresh_token
  • grant_type (codé en dur en tant quefresh_token)

Le la procédure de rafraîchissement du jeton est la suivante suit :

$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

La clé pour résoudre le problème est de comprendre que ce jeton initial obtenu lors de l'authentification possède un jeton d'actualisation. Bien que le jeton initial expire dans l’heure, le jeton d’actualisation peut être exploité pour obtenir un nouveau jeton. Cependant, il est crucial de noter que ce jeton temporaire expire également après une heure et n'est pas associé à un jeton d'actualisation. Par conséquent, pour récupérer un nouveau jeton temporaire, le jeton d'actualisation du jeton initial doit être utilisé.

Pour plus de clarté, le code suivant fournit une explication détaillée :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn