Accès hors connexion PHP de l'API Google, "invalid_grant: le code a déjà été utilisé"
Comment autoriser un Google le Client en permanence jusqu'à ce que l'utilisateur retire l'autorisation?
Je suis en train de faire une application qui se connecte à Google Agenda. Il doit courir en PHP et donc je suis en utilisant l'API de Google PHP client fourni par google.
L'application doit avoir accès hors ligne, de sorte qu'il fonctionne lorsque l'utilisateur n'est pas en session. L'application est destinée à permettre à l'utilisateur de gérer et d'afficher ses calendriers publiquement sur les sites web et autres.
J'ai créé les informations d'identification dans Google Console, à l'aide de la méthode de service (avec un numéro de client et le client secret). À l'aide de l'API de Google client, je me suis également demandé l'autorisation de l'utilisateur. J'ouvre une nouvelle fenêtre de navigateur, l'utilisateur autorise, un code d'autorisation est retourné par Google. Je profite de ce code, de la stocker et l'utiliser pour autoriser le client, qui se connecte avec succès à Google Agenda et l'échange de données.
Maintenant, j'ai compris c'est un geste qui va expirer. Sauf si on utilise l'accès hors connexion, que j'ai mis. Cependant, après quelques minutes ou moins, je reçois toujours un message d'erreur: Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.
C'est le code que j'utilise pour connecter le client:
$client = new \Google_Client();
$client->setApplicationName( 'My App' );
$client->setScopes( array( \Google_Service_Calendar::CALENDAR ) );
$client->setClientId( $this->google_client_id );
$client->setClientSecret( $this->google_client_secret );
$client->setRedirectUri( $this->google_client_redirect );
$client->setAccessType( 'offline' );
if ( $code = $this->google_client_auth ) {
try {
$client->authenticate( $code );
} catch( \Exception $e ) {
var_dump( $e );
}
}
return new \Google_Service_Calendar( $client );
C'est une méthode à l'intérieur d'une classe.
L'identification du client et la clé secrète client sont stockées dans les paramètres de l'application.
Je suis aussi de stocker le code retourné par l'utilisateur dans un cadre, mais je pense que c'est là que je me fais mal? Je suis de mettre le lien de Google OAuth fenêtre dans une autre méthode (qui utilise aussi le même identifiant client et de secret et de jeux hors ligne). Et pour obtenir l'autorisation de travail. Je peux obtenir pour les calendriers. Il n'a tout simplement pas durer longtemps...
source d'informationauteur unfulvio
Vous devez vous connecter pour publier un commentaire.
Il existe trois types de codes ou de jetons Googles Authentcation serveur renvoie.
Code d'authentification
Lorsqu'un utilisateur clique sur le Authentcation forme et donne à votre demande d'accès. Google renvoie une Authentcation code. Vous devez prendre ce code et de l'échanger pour un jeton d'Accès et un jeton d'actualisation. Ce code est utilisé seulement une fois si vous essayez de l'utiliser à nouveau, vous obtiendrez un message d'erreur.
Jeton d'accès
Jetons d'accès sont utilisés pour accéder à l'Api de ce jeton doit être transmis avec chaque demande que vous faites. Les jetons d'accès sont de courte durée, qu'ils travaillent pour une heure, puis ils s'arrêtent de travailler
Actualiser jeton
Actualiser les jetons doivent être enregistrés sur votre serveur quelque part. Une fois le jeton d'accès expire, vous pouvez utiliser le jeton d'actualisation pour obtenir un nouveau jeton d'accès.
Votre problème est que vous enregistrez le code d'authentification qui n'est d'aucune utilité pour vous. Vous devez trouver le jeton d'actualisation et de les enregistrer.