2013-01-14 16 views
8

Ho quasi cercato tutti i risultati della prima pagina di google per questo. Ma non riesco a trovare la risposta. Sto lavorando con un refresh_token dell'API di Google e sto ricevendo:Token di aggiornamento di Google-api-php restituisce invalid_grant

Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant" } 

Quello che sto facendo. Primo: Sto creando e la memorizzazione di una connessione persistente alla API di Google:

$client = new Google_Client(); 
$client->setClientId('xxxxxx-s73q0pa41aq3i2kcpatmpas6e6kkp99h.apps.googleusercontent.com'); 
$client->setClientSecret('xxxxxxxxxxxx'); 
$client->setRedirectUri('http://xxxxxxxx/generaterefreshtoken.php'); 
$client->setScopes(array('https://www.googleapis.com/auth/drive')); 
$client->setAccessType('offline'); 


if (isset($_GET['code'])) { 
    $client->authenticate(); 
    $_SESSION['token'] = $client->getAccessToken(); 
    $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; 
    header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); 
} 

if (isset($_SESSION['token'])) { 
$client->setAccessToken($_SESSION['token']); 
} 

if (isset($_REQUEST['logout'])) { 
    unset($_SESSION['token']); 
    $client->revokeToken(); 
} 

if ($client->getAccessToken()) { 

    $jsonarray = json_decode($client->getAccessToken()); 
    $arrGoogleAuth['access_token']=$jsonarray->access_token; 
    $arrGoogleAuth['refresh_token']=$jsonarray->refresh_token; 
    //filewrite 

    $myFile = "refreshtoken.conf"; 
    $fh = fopen($myFile, 'w') or die("can't open file"); 
    fwrite($fh, $client->getAccessToken()); 
    fclose($fh); 


    /* 

    die(); 

    $service = new Google_DriveService($client); 
    $file = new Google_DriveFile(); 
    $file->setTitle('My document.txt'); 
    $file->setDescription('A test document'); 
    $file->setMimeType('text/plain'); 

    $data = file_get_contents('document.txt'); 

    $createdFile = $service->files->insert($file, array(
      'data' => $data, 
      'mimeType' => 'text/plain', 
     )); 

    print_r($createdFile); 
*/ 



    // The access token may have been updated lazily. 
    $_SESSION['token'] = $client->getAccessToken(); 
} else { 
    $auth = $client->createAuthUrl(); 
    header("Location: $auth"); 
} 

tutto funziona Quindi fondamentalmente e il token viene memorizzato in un file di testo:

{ 
"access_token":"xxxxxxxxxxxxxxxN4U0ys2wy5monxs0Xh5fu5ayKL0OIENo-d1sN6g3YA", 
"token_type":"Bearer", 
"expires_in":3600, 
"refresh_token":"xxxxxxxxxxxxDON-l90BNUcJgnkfZWDfg", 
"created":1358120143 
} 

quando sto cercando di autenticarsi utilizzando il seguente codice:

$client = new Google_Client(); 
$client->setClientId($googleDriveConfig['clientid']); 
$client->setClientSecret($googleDriveConfig['clientsecret']); 
$client->setRedirectUri(curPageURL); 
$client->setScopes(array('https://www.googleapis.com/auth/drive')); 
$client->refreshToken(file_get_contents('../_config/refreshtoken.conf')); 
$client->authenticate(); 

sto ottenendo il seguente errore: errore rinfrescante il token OAuth2, un messaggio: '{ "errore": "invalid_grant"}

risposta

-4

Prima di autenticazione, ci deve essere qualcosa di simile:

$client->grantType("refresh_token") 
+0

grantType non è una funzione su Google_Client, esiste una funzione refreshToken, ma non funziona neanche. – Mikushi

+0

Perché è stato selezionato correttamente se grantType non è una funzione effettiva all'interno della classe Google_Client? – EHerman

+0

Per chiunque stia cercando di aggiornare il proprio token di accesso usando un token di aggiornamento si può fare '' '$ client-> refreshToken ($ refresh_token); $ _SESSION ['token'] = $ client-> getAccessToken(); '' 'Si otterrà il valore restituito invalid_grant se si sta tentando di aggiornare qualcosa di diverso dal token di aggiornamento più recente. – EHerman

3

Il valore invalid_grant indica che il codice di autorizzazione è già stato utilizzato (disponibile in $GET['code']) o il tipo di applicazione configurato nella Console API di Google non è valido.

Assicurati di selezionare "Applicazione Web" quando registri la tua app nella Console delle API di Google.

6

Si otterrà un errore "invalid_grant", se si tenta di aggiornare quando il token non è scaduto.

Invece di questo:

$client->refreshToken(file_get_contents('../_config/refreshtoken.conf')); 

Utilizzare questa:

$client->setAccessToken(file_get_contents('../_config/refreshtoken.conf')); 

Una volta che il token scade si aggiorna dovrebbe funzionare.

0

La funzione che ha lavorato per me è la seguente

$ client-> setAccessType ("refresh_token");

0

Mi sono imbattuto in qualcosa di simile e il problema per me era il mio orologio di sistema (all'interno del Docker VM in cui stavo eseguendo il codice) non era sincronizzato con il tempo reale. Quindi stai richiedendo un token con una data di creazione troppo lontana nel passato o nel futuro, che OAuth sta rifiutando.

Sono stato manomesso dal rapporto here.

Problemi correlati