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