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