Maison >développement back-end >tutoriel php >Comment résoudre l'erreur « invalid_grant » lors de l'actualisation des jetons d'accès à l'API Google Analytics ?

Comment résoudre l'erreur « invalid_grant » lors de l'actualisation des jetons d'accès à l'API Google Analytics ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-02 09:58:17153parcourir

How to Troubleshoot the

Actualisation des jetons d'accès avec le client API Google

Lors de l'interaction avec l'API Google Analytics (V3), il est crucial de gérer l'expiration des jetons pour maintenir accès aux données. Le client API Google fournit une méthode rafraîchirToken() pour obtenir un nouveau jeton d'accès à l'aide d'un jeton d'actualisation. Cependant, vous pouvez rencontrer une erreur « invalid_grant » en essayant d'utiliser cette méthode.

Comprendre l'expiration du jeton

Un jeton d'accès a une durée de vie limitée, généralement une heure. Après l'expiration du jeton, un nouveau jeton d'accès doit être obtenu. La méthode rafraîchirToken() peut être utilisée pour récupérer un nouveau jeton d'accès.

Débogage de l'erreur "invalid_grant"

L'erreur "invalid_grant" indique que le jeton d'actualisation est utilisé n’est pas valide ou a expiré. Pour résoudre ce problème, vérifiez les points suivants :

  • Assurez-vous que vous utilisez le bon jeton d'actualisation associé au jeton d'accès expiré.
  • Vérifiez que le jeton d'actualisation n'a pas expiré (son la durée de vie est d'environ 6 mois).

Exemple de code

Vous trouverez ci-dessous un exemple simplifié qui montre comment actualiser un jeton d'accès et le stocker dans une base de données :

<?php
use Google\Client;
use Google\Service\Analytics;

// Set up your client and credentials
$client = new Client();
$client->setClientId('YOUR_CLIENT_ID');
$client->setClientSecret('YOUR_CLIENT_SECRET');
$client->setRedirectUri('YOUR_REDIRECT_URI');
$client->setScopes('https://www.googleapis.com/auth/analytics.readonly');
$client->setState('offline');

// Retrieve the original access token (with a refresh token) from your database
$original_access_token = json_decode($token, true);
$refresh_token = $original_access_token['refresh_token'];

// Check if the original access token has expired
$time_created = $original_access_token['created'];
$time_now = time();
$time_diff = $time_now - $time_created;

// Refresh the access token if it has expired
if ($time_diff > 3600) {
    // Check if a refresh token exists in the database
    $refresh_token_query = "SELECT * FROM token WHERE type='refresh'";
    $refresh_token_result = mysqli_query($cxn, $refresh_token_query);

    // If a refresh token exists, use it to get a new access token
    if ($refresh_token_result != 0) {
        $refresh_token_row = mysqli_fetch_array($refresh_token_result);
        $refresh_token_created = json_decode($refresh_token_row['token'], true)['created'];
        $refresh_token_time_diff = $time_now - $refresh_token_created;

        // If the refresh token has expired, update it
        if ($refresh_token_time_diff > 3600) {
            $client->refreshToken($refresh_token);
            $new_access_token = $client->getAccessToken();

            // Update the refresh token in the database
            $refresh_token_update_query = "UPDATE token SET token='$new_access_token' WHERE type='refresh'";
            mysqli_query($cxn, $refresh_token_update_query);

            // Update the original access token in the database
            $original_access_token_update_query = "UPDATE token SET token='$new_access_token' WHERE type='original'";
            mysqli_query($cxn, $original_access_token_update_query);
        } else {
            // Use the existing refresh token to get a new access token
            $client->refreshToken($refresh_token);
            $new_access_token = $client->getAccessToken();

            // Update the original access token in the database
            $original_access_token_update_query = "UPDATE token SET token='$new_access_token' WHERE type='original'";
            mysqli_query($cxn, $original_access_token_update_query);
        }
    } else {
        // If a refresh token does not exist, retrieve a new one
        $client->refreshToken($refresh_token);
        $new_access_token = $client->getAccessToken();

        // Insert the new refresh token into the database
        $refresh_token_insert_query = "INSERT INTO token (type, token) VALUES ('refresh', '$new_access_token')";
        mysqli_query($cxn, $refresh_token_insert_query);

        // Update the original access token in the database
        $original_access_token_update_query = "UPDATE token SET token='$new_access_token' WHERE type='original'";
        mysqli_query($cxn, $original_access_token_update_query);
    }
}

// Use the new or refreshed access token to make API calls
$service = new Analytics($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