2015-12-20 10 views
6

Sto affrontando un problema con lo script quickstart php qui: https://developers.google.com/drive/v2/web/quickstart/phpProblema con Google-API-PHP client, ottenendo errore durante l'esecuzione dello script di avvio rapido

Quando eseguo lo script prima volta, esegue alla perfezione e l'accesso token viene memorizzato in un file chiamato: drive-php-quickstart.json

Quando eseguo lo script seconda volta, mi dà l'errore: avviare

errore:

Avviso: indice indefinito: expires_in in \ google-api-php-client \ src \ Google \ Client.php on line 485

Errore irreversibile: eccezione non rilevata 'LogicException' con messaggio 'token di aggiornamento deve essere passato o impostato come parte di setAccessToken' in

fine di errore:

la mia ipotesi è che token di accesso salvati nel file non è nel formato corretto.

formato attuale:

ya29.CODE-oN_Bearer36001/_ANOTHER-CODE-ANOTHER_ANOTHER_CODE

Come si può vedere, non contiene la variabile "expires_in"

Eventuali suggerimenti dove ho sto sbagliando? Sto eseguendo la sceneggiatura così com'è, senza modifiche.

+0

Che cosa, esattamente, si sono in esecuzione su App Engine?Il quickstart a cui fai riferimento, e apparentemente tutto il testo sulla tua domanda, indica che stai eseguendo localmente, niente a che fare con App Engine. Se sì, puoi cambiare i tag? In caso contrario, modifica la domanda per chiarire dove si trova App Engine? Grazie. –

+0

Grazie Alex. Ho apportato le modifiche. Sì, sto eseguendo attualmente localmente ma lo trasferirò a Google App Engine a breve. – CalmWinds

+0

Ho il problema esatto. Esecuzione dello script senza modifiche. La prima volta funziona alla perfezione, la seconda volta che balla con 'il token di aggiornamento deve essere passato o impostato come parte di setAccessToken'. – Erfan

risposta

12

Ho eseguito il debug su di esso .... La persona che lo ha scritto ha commesso un errore non chiamando json_encode prima di scrivere il risultato auth nel file token.json.

È possibile risolvere il problema con l'aggiunta di json_encode on line 45.

Quindi ...

file_put_contents($credentialsPath, $accessToken); 

... dovrebbe essere:

file_put_contents($credentialsPath, json_encode($accessToken)); 

mi hai inviato un feedback così si spera sarà risolto

edit: stesso problema si verifica per la chiamata token di aggiornamento in quello stesso metodo

EDIT2: Ecco il mio commento relativo ad una discussione Github e una risposta da Google: https://github.com/google/google-api-php-client/issues/263#issuecomment-186557360

ho suggerito qualcosa lungo le seguenti linee :

if ($client->isAccessTokenExpired()) { 
    $refreshToken = $client->getRefreshToken(); 
    $client->refreshToken($refreshToken); 
    $newAccessToken = $client->getAccessToken(); 
    $newAccessToken['refresh_token'] = $refreshToken; 
    file_put_contents($credentialsPath, json_encode($newAccessToken)); 
} 

Invece di:

// Refresh the token if it's expired. 
if ($client->isAccessTokenExpired()) { 
    $client->refreshToken($client->getRefreshToken()); 
    file_put_contents($credentialsPath, $client->getAccessToken()); 
} 
+0

Grazie! Ho anche inviato un feedback. Anche se sembra essere la linea 47 –

+0

@RoshanBhumbra ah sì, forse è 47 .. Ci sono altre informazioni in questo biglietto Github: https://github.com/google/google-api-php-client/issues/263#issuecomment -186557360 – Erfan

+0

@Erfan - Ho dovuto applicare le impostazioni refresh_token nel commento github. Puoi menzionarlo qui o incollare lo snippet qui? Sento che sarebbe utile. –

0

Google ha aggiornato il suo PHP Quickstart, con un metodo migliore per gestire questa situazione:

// Exchange authorization code for an access token. 
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode); 
$client->setAccessToken($accessToken); 

// Refresh the token if it's expired. 
if ($client->isAccessTokenExpired()) { 
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); 
file_put_contents($credentialsPath, json_encode($client->getAccessToken())); 
} 
Problemi correlati