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 ?
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 :
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!