Come autorizzare un cliente di Google in modo permanente fino a quando l'utente revoca l'autorizzazione?Accesso offline PHP API di Google, "invalid_grant: codice già utilizzato"
Sto tentando di creare un'app che si connette a Google Calendar. Deve funzionare in PHP e quindi sto usando il client PHP API di Google fornito da google.
L'app deve avere accesso offline in modo che funzioni quando l'utente non è nella sessione. L'app ha lo scopo di consentire all'utente di gestire e visualizzare i suoi calendari pubblicamente su siti Web e simili.
Ho creato credenziali in Google Console, utilizzando il metodo di servizio (con un ID client e un segreto client). Utilizzando il client API di Google ho anche richiesto l'autorizzazione dell'utente. Apro una nuova finestra del browser, l'utente autorizza, un codice di autorizzazione viene restituito da Google. Prendo questo codice, lo memorizzo e lo uso per autorizzare il client, che si collega con successo a Google Calendar e scambia dati.
Ora ho capito che questo è un token che sta per scadere. A meno che non si utilizzi l'accesso offline, che ho impostato. Tuttavia, dopo un paio di minuti o meno sarò sempre ottengo un errore: Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.
Questo è il codice che uso per il collegamento del 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);
Questo è un metodo all'interno di una classe.
L'ID client e il segreto del client sono memorizzati nelle impostazioni dell'app.
Sto anche memorizzando il codice restituito dall'utente in un'impostazione, ma penso che questo sia dove sto facendo male? Sto mettendo il link a una finestra di Google OAuth in un metodo separato (che usa anche lo stesso ID client e segreto e imposta anche il metodo offline. E ottenere l'autorizzazione funziona. Posso accedere ai calendari. Non dura solo a lungo ...
grazie ... ma perché ho bisogno sia del token di accesso che del token di aggiornamento immediatamente? L'API ha due metodi getAccessToken e getRefreshToken. Ma solo un setter setAccessToken. Quando ottengo il codice di autenticazione da parte dell'utente posso eseguire getAuth() -> autenticare ma l'API non dice se quello che restituisce è un token di accesso o di aggiornamento. Devo passare il risultato di getAuth-> authenticate a setAccessToken? A cosa serve getAccessToken, quindi? – unfulvio
inoltre, dall'API PHP di Google sembra che il token di accesso sia un oggetto JSON, ma il token di aggiornamento è una stringa? Quindi devo passare il token di aggiornamento al metodo getAuth-> authenticate()? – unfulvio
ha trovato alcune risposte qui: https://developers.google.com/identity/protocols/OAuth2WebServer?hl=it – unfulvio