Ich möchte das Zugriffstoken von Google erhalten. Die Google-API gibt an, dass zum Abrufen des Zugriffstokens der Code und andere Parameter an die Token-Generierungsseite gesendet werden sollen. Die Antwort lautet wie folgt: JSON-Objekt:
{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
Ich erhalte jedoch kein Aktualisierungstoken. Die Antwort in meinem Fall lautet:
{
"access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}
gdata
gdata-api
access-token
Muhammad Usman
quelle
quelle
Antworten:
Die
refresh_token
wird nur bei der ersten Autorisierung durch den Benutzer bereitgestellt. Nachfolgende Berechtigungen, wie sie beispielsweise beim Testen einer OAuth2-Integration vorgenommen werden, geben die nichtrefresh_token
erneut zurück. :) :)refresh_token
(vorausgesetzt, sie enthält auch den Abfrageparameter 'access_type = offline'.Alternativ können Sie die Abfrageparameter
prompt=consent&access_type=offline
zur OAuth-Umleitung hinzufügen (siehe Googles Seite OAuth 2.0 für Webserveranwendungen ).Dadurch wird der Benutzer aufgefordert, die Anwendung erneut zu autorisieren, und es wird immer a zurückgegeben
refresh_token
.quelle
access_type=offline
in allen Fällen, wenn Sie die wollenrefresh_token
.$client->setAccessType('offline')
. Dasfunction setApprovalPrompt()
istforce
standardmäßig bereits übergeben .Um die Refresh - Token Sie beide hinzuzufügen haben
approval_prompt=force
undaccess_type="offline"
wenn Sie die Java - Client von Google bereitgestellt verwenden es wie folgt aussehen:quelle
Ich habe eine lange Nacht gesucht und das macht den Trick:
Geänderte user-example.php von admin-sdk
Dann erhalten Sie den Code unter der Umleitungs-URL und die Authentifizierung mit dem Code sowie das Aktualisierungstoken
Du solltest es jetzt aufbewahren;)
Wenn Ihr Zugriffsschlüssel abgelaufen ist, tun Sie es einfach
quelle
Dies hat mich verwirrt und ich dachte, ich würde teilen, was ich auf die harte Tour gelernt habe:
Wenn Sie den Zugriff mit den Parametern
access_type=offline
und anfordernapproval_prompt=force
, sollten Sie sowohl ein Zugriffstoken als auch ein Aktualisierungstoken erhalten . Das Zugriffstoken läuft bald nach Erhalt ab und Sie müssen es aktualisieren.Sie haben die Anforderung zum Abrufen eines neuen Zugriffstokens korrekt gestellt und die Antwort mit Ihrem neuen Zugriffstoken erhalten . Ich war auch verwirrt darüber, dass ich kein neues Aktualisierungstoken erhalten habe . Dies ist jedoch so gemeint, da Sie immer wieder dasselbe Aktualisierungstoken verwenden können.
Ich denke, einige der anderen Antworten gehen davon aus, dass Sie sich aus irgendeinem Grund ein neues Aktualisierungstoken zulegen wollten, und schlugen vor, dass Sie den Benutzer erneut autorisieren, aber tatsächlich müssen Sie dies nicht tun, da das Aktualisierungstoken, das Sie haben, erst funktioniert vom Benutzer widerrufen.
quelle
Die Antwort von Rich Sutton funktionierte schließlich für mich, nachdem mir klar wurde, dass das Hinzufügen
access_type=offline
auf der Anfrage des Front-End- Clients nach einem Autorisierungscode erfolgt, nicht auf der Back-End-Anfrage, die diesen Code gegen ein access_token austauscht. Ich habe seiner Antwort und diesem Link bei Google einen Kommentar hinzugefügt, um weitere Informationen zum Aktualisieren von Token zu erhalten.PS Wenn Sie Satellizer verwenden, können Sie diese Option wie folgt zu $ authProvider.google in AngularJS hinzufügen .
quelle
Um das zu erhalten
refresh_token
, müssen Sie esaccess_type=offline
in die OAuth-Anforderungs-URL aufnehmen. Wenn sich ein Benutzer zum ersten Mal authentifiziert, erhalten Sie eine Nicht-Nullrefresh_token
sowie eineaccess_token
abgelaufene zurück.Wenn ein Benutzer ein Konto erneut authentifiziert, für das Sie bereits ein Authentifizierungstoken haben (wie oben bei @SsjCosty erwähnt), müssen Sie Informationen von Google zurückerhalten, für welches Konto das Token bestimmt ist. Fügen Sie dazu hinzu
profile
dazu Ihre Bereiche hinzu. Wenn Sie den OAuth2 Ruby-Edelstein verwenden, sieht Ihre endgültige Anfrage möglicherweise folgendermaßen aus:Beachten Sie, dass der Bereich zwei durch Leerzeichen getrennte Einträge enthält, einen für den schreibgeschützten Zugriff auf Google Analytics und
profile
einen für OpenID Connect.Dies führt dazu, dass Google ein zusätzliches Attribut bereitstellt, das
id_token
in derget_token
Antwort aufgerufen wird . Um Informationen aus dem id_token zu erhalten, lesen Sie diese Seite in den Google-Dokumenten. Es gibt eine Handvoll von Google bereitgestellter Bibliotheken, die dies für Sie validieren und "dekodieren" (ich habe das Ruby -Juwel "google-id-token" verwendet ). Sobald Sie es analysiert haben, ist dersub
Parameter effektiv die eindeutige Google-Konto-ID.Bemerkenswert, wenn Sie sich ändern den Bereich , erhalten Sie erneut ein Aktualisierungstoken für Benutzer, die sich bereits beim ursprünglichen Bereich authentifiziert haben. Dies ist nützlich, wenn Sie beispielsweise bereits eine Reihe von Nutzern haben und nicht möchten, dass alle Benutzer die App in Google deaktivieren.
Oh, und eine letzte Anmerkung: Sie müssen nicht brauchen
prompt=select_account
, aber es ist nützlich , wenn Sie eine Situation, wo Ihre Benutzer möchten vielleicht mit mehr als einem Google - Konto authentifizieren (dh Sie verwenden diese nicht für die Anmeldung in / Authentifizierung) .quelle
1. Wie bekomme ich 'refresh_token'?
Lösung: Die Option access_type = 'offline' sollte beim Generieren von authURL verwendet werden. Quelle: Verwenden von OAuth 2.0 für Webserveranwendungen
2. Aber selbst mit 'access_type = offline' erhalte ich nicht das 'refresh_token'?
Lösung: Bitte beachten Sie, dass Sie es nur bei der ersten Anforderung erhalten. Wenn Sie es also irgendwo speichern und es vorgesehen ist, dies in Ihrem Code zu überschreiben, wenn Sie nach Ablauf des vorherigen Ablaufs ein neues access_token erhalten, stellen Sie sicher, dass Sie diesen Wert nicht überschreiben.
Aus Google Auth Doc: (dieser Wert = access_type)
Wenn Sie erneut 'refresh_token' benötigen, müssen Sie den Zugriff für Ihre App entfernen, indem Sie die in Rich Suttons Antwort beschriebenen Schritte ausführen .
quelle
Wenn Sie dies einstellen, wird das Aktualisierungstoken jedes Mal gesendet:
Ein Beispiel ist unten angegeben (PHP):
quelle
Für mich habe ich versucht,
CalendarSampleServlet
von Google zur Verfügung gestellt. Nach 1 Stunde läuft der access_key ab und es wird auf eine 401-Seite umgeleitet. Ich habe alle oben genannten Optionen ausprobiert, aber sie haben nicht funktioniert. Schließlich konnte ich beim Überprüfen des Quellcodes auf 'AbstractAuthorizationCodeServlet' feststellen , dass die Umleitung deaktiviert ist, wenn Anmeldeinformationen vorhanden sind, aber im Idealfall sollte dies überprüft werdenrefresh token!=null
. Ich habe den folgenden Code hinzugefügtCalendarSampleServlet
und es hat danach funktioniert. Große Erleichterung nach so vielen Stunden der Frustration. Danke Gott.quelle
Jetzt hatte Google diese Parameter in meiner Anfrage abgelehnt (access_type, prompt) ... :( und es gibt überhaupt keine Schaltfläche "Zugriff widerrufen". Ich bin frustriert, weil ich mein refresh_token lol zurückbekommen habe
UPDATE: Ich habe die Antwort hier gefunden: D Sie können das Aktualisierungstoken durch eine Anfrage https://developers.google.com/identity/protocols/OAuth2WebServer zurückerhalten
quelle
quelle
Mit den Offline - Zugriff und prompt: Zustimmung gut für mich gearbeitet:
quelle
Meine Lösung war ein bisschen komisch. Ich habe jede Lösung ausprobiert, die ich im Internet gefunden habe, und nichts. Überraschenderweise hat dies funktioniert: Löschen Sie die Anmeldeinformationen.json, aktualisieren Sie, vinculieren Sie Ihre App erneut in Ihrem Konto. Die neue Datei credentials.json enthält das Aktualisierungstoken. Sichern Sie diese Datei irgendwo. Verwenden Sie dann Ihre App so lange, bis der Fehler beim Aktualisieren des Tokens erneut auftritt. Löschen Sie die Datei crendetials.json, die jetzt nur noch eine Fehlermeldung enthält (dies ist in meinem Fall passiert), und fügen Sie dann Ihre alte Anmeldeinformationsdatei in den Ordner ein. Fertig! Es ist 1 Woche her, seit ich das getan habe und hatte keine Probleme mehr.
quelle
Um bei der Authentifizierung jedes Mal ein neues refresh_token zu erhalten, sollte der im Dashboard erstellte Typ der OAuth 2.0-Anmeldeinformationen "Andere" sein. Wie oben erwähnt, sollte beim Generieren der authURL auch die Option access_type = 'offline' verwendet werden.
Wenn Sie Anmeldeinformationen vom Typ "Webanwendung" verwenden, funktioniert keine Kombination von Eingabeaufforderungs- / Genehmigungsaufforderungsvariablen. Sie erhalten das refresh_token nur bei der ersten Anforderung.
quelle