Google-API-Client "refresh token muss weitergegeben werden, oder als Bestandteil von setAccessToken"
Ich stehe aktuell vor einem sehr seltsamen problem, ja ich habe nach genau dieser Anleitung ( https://developers.google.com/google-apps/calendar/quickstart/php ), die von Google-API-Dokumentation. Ich versuchte es zweimal, beim ersten mal, es funktioniert wie ein Charme, aber nachdem das access-token hatte zum Ablauf des Skripts direkt von der Google-API-Doc nicht in der Lage war, um es zu aktualisieren.
TL;DR
Hier ist die Fehlermeldung:
sam@ssh:~$ php www/path/to/app/public/quickstart.php
Fatal error: Uncaught exception 'LogicException' with message 'refresh token must be passed in or set as part of setAccessToken' in /home/pueblo/www/path/to/app/vendor/google/apiclient/src/Google/Client.php:258
Stack trace:
#0 /home/pueblo/www/path/to/app/public/quickstart.php(55): Google_Client->fetchAccessTokenWithRefreshToken(NULL)
#1 /home/pueblo/www/path/to/app/public/quickstart.php(76): getClient()
#2 {main}
thrown in /home/pueblo/www/path/to/app/vendor/google/apiclient/src/Google/Client.php on line 258
Ist hier der Teil, der das php-Skript von google habe ich geändert:
require_once __DIR__ . '/../vendor/autoload.php';
//I don't want the creds to be in my home folder, I prefer them in the app's root
define('APPLICATION_NAME', 'LRS API Calendar');
define('CREDENTIALS_PATH', __DIR__ . '/../.credentials/calendar-php-quickstart.json');
define('CLIENT_SECRET_PATH', __DIR__ . '/../client_secret.json');
Habe ich auch geändert, die expandHomeDirectory
so konnte ich "deaktivieren", ohne das ändern zu viel code:
function expandHomeDirectory($path) {
$homeDirectory = getenv('HOME');
if (empty($homeDirectory)) {
$homeDirectory = getenv('HOMEDRIVE') . getenv('HOMEPATH');
}
return $path;
//return str_replace('~', realpath($homeDirectory), $path);
}
Also zu überprüfen, ob ich falsch war, oder falls Google war, habe ich ein experiment: gestern Abend starte ich den Schnellstart-Skript aus ssh um zu überprüfen, ob es funktioniert, und es war wirklich, also beschloss ich, check das morgen, wenn es noch funktioniert so wie es war, bevor ich schlief, und es war nicht so dass ich denke, es gibt etwas falsch mit Google quickstart.php
.
Ich hoffe, dass mir jemand helfen könnte, ich bereits überprüft, alle anderen Beiträge zu dem Thema aber Sie sind alle veraltet.
- Ich denke, das SO Frage kann Ihnen helfen.
- Nein, in der Tat sieht es wie eine gültige Antwort, aber der Fehler dieses Benutzer gemeldet hatte, bereits fest in den code, den ich verwende, da er senden Sie ein ticket an Google, die es behoben. Aber danke für den Versuch mir zu helfen 🙂
- Ab 20. November 2017, das Google-Beispiel-PHP-code veröffentlicht quickstart.php ist dennoch mit dem Fehler, dass Sie gefragt haben...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hab das gleiche problem vor kurzem, und ich löste es mit diesem.
Ich erkläre .....
Refresh token wird nicht zurückgegeben, weil wir nicht die Kraft der approvalPrompt. Der offline-Modus ist nicht genug. Wir müssen die Kraft der approvalPrompt. Auch die redirectURI muss festgelegt werden, bevor diese zwei Optionen. Es funktionierte für mich.
Dies ist mein voller Funktion
$client->setTokenCallback(...)
gibt Sie einen Haken zum speichern der neuen token jedes mal, wenn der client (automatisch) aktualisiert es. Wenn nicht, dann sind Sie am Ende erfrischend, die token auf jeder einzelnen API-Aufruf von einer Stunde nach der ersten Zulassung. Das mag in Ordnung sein, wenn nur eine einzige der geplanten API-Aufruf einmal am Tag, aber fügt eine Menge Aufwand, wenn es läuft wesentlich öfter.Ich habe vor dem gleichen Problem mit der neuen google api-Bibliothek. Suche für die Lösung brachte der folgende link:
RefreshToken Nicht immer zurück senden, nachdem ich neue token in google-Tabellen-API
Basierend auf dieser information, die ich geändert haben quickstart code-Teil zu meinen Anforderungen passen. Nach der ersten Autorisierung mit Google habe ich erhalten-Laufwerk-php-quickstart.json enthält refresh_token abläuft in 3600 Sekunden oder eine Stunde. Der refresh-token wird nur einmal ausgegeben, so dass, wenn es verloren ist, dann re-Autorisierung erforderlich ist.
So, das haben Sie immer in Fahrt-php-quickstart.json habe ich getan, folgende:
Mein Rat ist speichern refresh-token .json sofort nach get access token und wenn access token abgelaufen ist, verwenden Sie refresh token.
Meiner Projekte auf diese Weise funktionieren:
nur einige update für alle, die Probleme mit dieser Nachricht, meistens ist es da nur der erste Befehl fetchAccessTokenWithAuthCode() erzeugt credencials enthält die refresh-token (technisch für immer gültig - keine 2 Stunden Gültigkeit, wenn Sie nicht widerrufen). Wenn Sie sich den neuen ersetzt es das original, aber es ist nicht enthält die refresh-token, die es braucht, also das nächste mal, wenn Sie müssen, aktualisieren Sie das token, wird es Abstürzen. Dies kann leicht behoben werden durch Austausch der refresh-Funktion, um zum Beispiel diese:
Nun jedes mal, wenn Sie aktualisieren das Zugriffstoken Ihre refresh token wird weitergegeben auch.
Ich hatte die gleichen Probleme und schließlich gehen diese arbeiten:
Vorgeschichte:
Habe ich den gleichen Fehler. Hier ist was ich gefunden habe:
Dieser Fehler:
PHP Fatal error: Uncaught LogicException: refresh-token muss weitergegeben werden, oder als Bestandteil von setAccessToken in /Library/WebServer/Documents/Sites/test/scripts/vendor/google/apiclient/src/Google/Client.php:267
Ist, verweisen auf das update access token (alias-Aktualisierung) Methode:
Warum war es ausfällt? Lange Geschichte kurz, ich erkannte, wenn ich druckte mir die $accessToken-array, das kommt von der Dekodierung dieser json-Datei (per quickstart-code, den Sie geschrieben/das kommt von google)
Anmeldeinformationen/calendar-php-quickstart.json
Ich habe den Fehler gefunden durch wie das accessToken array druckt, wenn ich print_r:
Array
(
[access_token] => Array
(
[access_token] => xyz123
[token_type] => Träger
[expires_in] => 3600
[refresh_token] => xsss112222
[erstellt] => 1511379484
)
)
Lösung:
$refreshToken = $accessToken["access_token"]["refresh_token"];
direkt vor dieser Zeile:
Kann ich endlich aktualisieren Sie das token als gebraucht, wenn es läuft in einer Stunde. Ich denke, dass die devs dieses Artikels angenommen, der array-prints:
Array
(
[access_token] => xyz123
[token_type] => Träger
[expires_in] => 3600
[refresh_token] => xsss112222
[erstellt] => 1511379484
)
also dachten Sie, Sie könnten nur $accessToken["refresh_token"]; Das ist nicht korrekt.
Haben wir nun einen gültigen Wert für $refreshToken, so sollte der Fehler verschwinden, wenn Sie dies tun. Ich auch aktualisiert, der Autor über den feedback-link zu lassen Sie Sie wissen, über diese, bei anderen php-devs dieses Problem Auftritt. Hoffentlich hilft jemand. Ich entschuldige mich, wenn ich formatiert diesen Beitrag schlecht, ich bin neu so-ich wollte nur zu teilen, wie ich endlich diese Arbeit.
Müssen Sie serialisiert die
accestoken
wenn Sie es schreiben, um diecredentialsPath
.Und beim Lesen aus der Datei, die Sie brauchen, um unserialize es.
Volle Funktion
Google hat aktualisiert Ihre PHP-Quickstart, mit einer verbesserten Methode, dies zu behandeln:
Snippet unter:
In meinem Fall hatte ich vergessen, setzen Sie die Zugangsart "offline", ohne die die refresh-token wurde nicht erzeugt.
Sobald dies geschehen ist, werden die sample-code in der google-Dokumentation funktionieren wird.
So Nach einiger Zeit vieweing diesem code:
alles nötig war, ist diese änderung:
da diese Funktion $client->getRefreshToken() gibt null zurück, und wenn Sie die $accessToken direkt, es wird gut funktionieren und aktualisieren Sie Ihre Datei, hoffe, es löst jemand Problem.