2013-12-13 6 views
15

Ho un'applicazione basata sul Web che utilizza Google OAuth2.0 come framework di accesso. Funziona bene fino a ieri. L'applcation non è riuscita a ottenere il token di aggiornamento dopo che il token di accesso è scaduto. Oltre a ciò, la pagina "Richiesta di autorizzazione" era cambiata in "Accesso offline" invece di "Sapere chi sei su Google" e "Visualizza email"Il token di accesso OAuth 2.0 è scaduto e un token di aggiornamento non è disponibile

In origine, la pagina "Richiesta di autorizzazione" richiede il accesso a "Sapere chi sei su Google" e "Visualizza email". Dopo il logout dell'utente e il secondo accesso, la pagina "Richiesta di autorizzazione" sarà la stessa.

Tuttavia, fino a ieri, la pagina "Richiesta di autorizzazione" è stata modificata in "Accesso non in linea". Dopo che il token di accesso è scaduto, ho ricevuto il messaggio di errore di seguito:

PHP Errore irreversibile: eccezione non rilevata 'Google_AuthException' con messaggio 'Il token di accesso OAuth 2.0 è scaduto e un token di aggiornamento non è disponibile. I token di aggiornamento non vengono restituiti per le risposte che sono state approvate automaticamente. ' in /home2/xxxx/public_html/test/google-api-php-client/src/auth/Google_OAuth2.php:221

Ho provato $client->setAccessType('online');. Tuttavia, ho ancora questo errore fatale con me. Qui di seguito è il mio codice per ottenere il token di accesso:

if ($client->getAccessToken()) { 
     $token = $client->getAccessToken(); 
     $authObj = json_decode($token); 
     $refreshToken = $authObj->refresh_token; 
     $user = $oauth2->userinfo->get(); 
     $me = $plus->people->get('me'); 
     $email = filter_var($user['email'], FILTER_SANITIZE_EMAIL); // get the USER EMAIL ADDRESS using OAuth2 

     $optParams = array('maxResults' => 100); 
     $activities = $plus->activities->listActivities('me', 'public', $optParams); 


     $_SESSION['access_token'] = $client->getAccessToken(); 
    } else { 
     $authUrl = $client->createAuthUrl(); 
    } 

Ho provato a cercare problema simile, come me, ma non riuscivo a trovarne uno. Questo è successo da ieri. Prima di questo, non ho mai apportato alcuna modifica ai codici.

+0

Per quanto ne so, hanno cambiato un po 'la loro gestione della sicurezza. Se ora concedi l'accesso a un'app, Google sa per il futuro, quali autorizzazioni hai richiesto e le salva e ti verrà chiesto di nuovo, se desideri disporre di nuove autorizzazioni o accesso offline. Penso che si sia trattato di un bug temporaneo mentre stavano aggiornando il loro sistema, perché non ho riscontrato alcun problema al momento. Aggiornamento –

+0

: hai ragione, non posso più usare i token di aggiornamento ... –

+0

Puoi dirmi come sbarazzarsi di questo? – Akilsree1

risposta

18

Con i suoi commenti, Fabian Parzefall mi ha aiutato a risolverlo.

Ecco il mio script:

if($client->isAccessTokenExpired()) { 

    $authUrl = $client->createAuthUrl(); 
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL)); 

} 

In realtà è piuttosto semplice. Invece di chiedergli di fare clic sul pulsante "connettimi" (come indicato dallo script demo fornito dal team dell'AP GA), lo reindirizzo direttamente. Non sono sicuro che sia il modo corretto/più sicuro, ma è quello che funziona per me adesso!

+0

Puoi spiegare, in che modo questa soluzione ha consentito all'API di approvare il tuo token di accesso? – Rodniko

+0

Questo snippet di codice non riguarda realmente il token di accesso, ma solo per impedire all'utente di accedere all'applicazione ogni 5 minuti. E mi dispiace, non ho toccato questo codice da molto tempo quindi non sarò in grado di aiutare in questo momento ... –

3
if($client->isAccessTokenExpired()) { 

    $client->authenticate(); 
    $NewAccessToken = json_decode($client->getAccessToken()); 
    $client->refreshToken($NewAccessToken->refresh_token); 

    } 
+3

authenticate() richiede il codice restituito dal sistema di autenticazione. –

+0

Ho capito che funziona, ma sembra esserci un ciclo infinito, poiché il token continua a scadere quando la pagina viene caricata. – JBS

2

La risposta di cui sopra è 'corretto', ma io faffed intorno lavorare fuori dove metterlo (!) ... quindi inviare questo per chiunque altro provare esempi che finiscono con gettoni in scadenza (!).

Una volta che il codice ha fatto qualsiasi cosa di cui ha bisogno, e il client ha un token di accesso ... quindi controlla che sia ancora valido e se non lo rimandi per la riautorizzazione!

// Stuff to do with getting tokens and storing in session etc... 

if ($client->getAccessToken()) { // Hey! we got one! 
    if($client->isAccessTokenExpired()) { // Oh! its not good - go for another 
     $authUrl = $client->createAuthUrl(); 
     header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL)); 
     exit(); 
    } 
    try{ 
... 
    } 
+0

Ho dovuto interrompere tutte le SESSIONI che hanno salvato e passato il token e lo stato sul reindirizzamento, ma non capisco perché non sia stato possibile disinserire il token salvato. Sospetto che lo stato venga utilizzato insieme al token, ma non ho potuto indagare e ho dovuto andare avanti. – imparante