2013-01-14 15 views
8

Ich habe fast jedes Ergebnis der ersten Seite von Google dafür gesucht. Aber ich kann nicht die Antwort finden. Ich arbeite mit einem refresh_token von Googles API und empfange:Google-API-Refresh Token gibt invalid_grant zurück

Was ich mache. Erstens: Ich erstelle und eine persistente Verbindung zum Google-API zu speichern:

$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"); 
} 

Also im Grunde alles läuft und das Token wird in einer Textdatei gespeichert:

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

Wenn ich versuche, die autorisierende mit dem folgenden Code:

$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(); 

ich die folgende Fehlermeldung erhalten: Fehler beim OAuth2 Token erfrischend, Meldung: ‚{ "Fehler": "invalid_grant"}

Antwort

-4

Vor Authentifizieren, muss es so etwas wie:

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

grantType ist keine Funktion auf Google_Client, es gibt eine refreshToken-Funktion, aber es funktioniert auch nicht. – Mikushi

+0

Warum wurde dies als richtig ausgewählt, wenn grantType keine tatsächliche Funktion innerhalb der Google_Client-Klasse ist? – EHerman

+0

Für alle anderen, die ihr Zugriffstoken mit einem Refresh-Token aktualisieren möchten, können Sie '' '$ client-> refreshToken ($ refresh_token); $ _SESSION ['token'] = $ client-> getAccessToken(); '' 'Sie erhalten das zurückgegebene invalid_grant, wenn Sie versuchen, etwas anderes als das zuletzt erteilte Aktualisierungs-Token zu aktualisieren. – EHerman

3

Der Invalid_grant bedeutet entweder, dass der Autorisierungscode bereits verwendet wurde (verfügbar in $GET['code']) oder der in der Google APIs-Konsole konfigurierte Anwendungstyp ungültig ist.

Vergewissern Sie sich, dass Sie "Web Application" auswählen, wenn Sie Ihre App in der Google APIs-Konsole registrieren.

6

Sie erhalten eine „invalid_grant“ Fehler, wenn Sie versuchen, zu aktualisieren, wenn das Token nicht abgelaufen ist.

Statt dessen:

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

verwenden:

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

Sobald Ihr Token Sie abläuft aktualisieren sollte funktionieren.

0

Die Funktion, die für mich gearbeitet ist wie

$ client- folgt> setAccessType ("refresh_token");

0

Ich stieß auf etwas ähnliches und das Problem für mich war meine Systemuhr (in der Docker VM, wo ich den Code ausgeführt wurde) war nicht mit der Echtzeit synchronisiert. Sie fordern also ein Token mit einem zu weit entfernten Datum in der Vergangenheit oder in der Zukunft an, das OAuth ablehnt.

Ich wurde von dem Bericht here Trinkgeld gegeben.

Verwandte Themen