Ich kann mein Aktualisierungstoken nicht mit meinem Code erhalten. Ich kann nur mein Zugriffstoken, meinen Tokentyp usw. erhalten. Ich habe einige Tutorials wie das Anlegen access_type=offline
meiner Anmelde-URL befolgt :
echo "<a href='https://accounts.google.com/o/oauth2/auth?"
. "access_type=offline&client_id=123345555.apps.googleusercontent.com& "
. "scope=https://www.googleapis.com/auth/calendar+https://www.googleapis.com/auth/plus.me&response_type=code& "
. "redirect_uri=http://www.sample.com/sample.php&state=/profile'>Google</a>";
und meine Felder beim Abrufen des Zugriffstokens:
$fields=array(
'code'=> urlencode($authcode),
'client_id'=> urlencode($clientid),
'client_secret'=> urlencode($clientsecret),
'redirect_uri'=> urlencode($redirecturi),
'grant_type'=> 'authorization_code',
);
Ich kann jedoch kein refresh_token erhalten , nur das access_token , den token_type , das id_token und das expires_in .
google-calendar-api
token
access-token
gdata
Robin Carlo Katakutan
quelle
quelle
Antworten:
Finden Sie es heraus, indem Sie dies zu Ihren URL-Parametern hinzufügen
Approval_prompt = KraftAktualisieren:
Verwenden Sie
access_type=offline&prompt=consent
stattdessen.approval_prompt=force
funktioniert nicht mehr https://github.com/googleapis/oauth2client/issues/453quelle
approval_prompt=auto
kein refresh_token mehr. Überprüfen Sie diese Antwort für eine detailliertere Erklärung stackoverflow.com/a/10857806/987864access_type=offline
in allen Fällen, wenn Sie das refresh_tokenprompt=consent
. Referenz: developer.google.com/identity/protocols/…access_type=offline&prompt=consent
. Andernfalls ist dasrefresh_token
nicht vorhanden.Wenn ich die Antwort von user987361 erweitern darf :
Aus dem Offline-Zugriffsteil der OAuth2.0-Dokumente:
Also, wenn Sie bereits Zugriff gewährt haben, nachfolgende Anforderungen für ein
grant_type
vonauthorization_code
werden die nicht zurückkehrenrefresh_token
, auch wennaccess_type
gesetzt wurdeoffline
die Zustimmung Seite in dem Query - String.Wie in dem Zitat oben erwähnt, um eine zu erhalten , neu
refresh_token
, nachdem bereits die Aufnahme eines, müssen Sie Ihren Benutzer zurück durch die Aufforderung senden, die Sie , indem Sie tun können ,approval_prompt
zuforce
.Prost,
PS Diese Änderung wurde auch in einem Blogbeitrag angekündigt .
quelle
refresh token
wenn Sie es verlieren oder Ihr Benutzer Ihren Zugriff widerruft. Andernfalls können Sie dasselbe weiterhin verwendenrefresh token
, um neueaccess token
s zu erhalten .Es ist
access_type=offline
das du willst.Dadurch wird das Aktualisierungstoken zurückgegeben, wenn der Benutzer die App zum ersten Mal autorisiert. Nachfolgende Aufrufe zwingen Sie nicht, die App erneut zu genehmigen (
approval_prompt=force
).Weitere Informationen finden Sie unter: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
quelle
Dies ist vollständiger Code in PHP mit dem offiziellen Google SDK
quelle
Für unsere App mussten wir beide Parameter verwenden
access_type=offline&prompt=consent
.approval_prompt=force
hat bei uns nicht funktioniertquelle
approval_prompt=force
, waren zu dieser Zeit wahrscheinlich richtig, funktionieren aber nicht mehr. Es gibt einige Diskussionen hier: github.com/google/oauth2client/issues/453Hallo, ich habe die folgenden Schritte ausgeführt und konnte das Aktualisierungstoken erhalten.
Der Autorisierungsablauf besteht aus zwei Schritten.
Ist es, den Autorisierungscode über die
https://accounts.google.com/o/oauth2/auth?
URL zu erhalten.Dazu wird eine Post-Anfrage mit folgenden Parametern gesendet.
'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline'
Wenn Sie oben angeben, erhalten Sie einen Autorisierungscode.Abrufen von AcessToken und RefreshToken mithilfe der
https://accounts.google.com/o/oauth2/token?
URL. Dazu wird eine Post-Anfrage mit folgenden Parametern gesendet."code": code, "client_id": CID, "client_secret": CSECRET, "redirect_uri": REDIRECT, "grant_type": "authorisation_code",
Wenn Sie also beim ersten Versuch die Berechtigungen autorisieren, können Sie das Aktualisierungstoken erhalten. Nachfolgende Versuche liefern das Aktualisierungstoken nicht. Wenn Sie das Token erneut möchten, widerrufen Sie den Zugriff in Ihrer Anwendung.
Hoffe das wird jemandem helfen jubeln :)
quelle
OAuth hat zwei Szenarien im Real-Modus. Der normale und standardmäßige Zugriffsstil wird als Online bezeichnet. In einigen Fällen muss Ihre Anwendung möglicherweise auf eine Google-API zugreifen, wenn der Nutzer nicht anwesend ist. , Es handelt sich um Offline-Szenarien. In Offline-Szenarien wird beim ersten Austausch des Autorisierungscodes ein Aktualisierungstoken abgerufen.
Sie können also referesh_token erhalten, einige Szenarien, nicht alle.
Sie können den Inhalt unter https://developers.google.com/identity/protocols/OAuth2WebServer#offline haben .
quelle
Verwenden Sie seit März 2016, um
prompt=consent
das Google API-Aktualisierungstoken neu zu generieren.Wie unter https://github.com/googleapis/oauth2client/issues/453 erwähnt ,
quelle
Für diejenigen, die die Google API Client Library für PHP verwenden und Offline-Zugriff und Aktualisierungstoken suchen, ist zum Zeitpunkt des Schreibens zu beachten, dass in den Dokumenten falsche Beispiele angezeigt werden.
Derzeit wird Folgendes angezeigt:
Quelle: https://developers.google.com/identity/protocols/OAuth2WebServer#offline
All dies funktioniert großartig - bis auf EIN Stück
Nach einigem Überlegen habe ich diese Zeile in die folgende geändert und ALLES hat funktioniert
Dies ist sinnvoll, da die Verwendung der HTTP-Anforderungen von Approval_prompt = Force in Prompt = Einwilligung geändert wurde . Das Ändern der Setter-Methode von setApprovalPrompt auf setPrompt folgt also der natürlichen Konvention - ABER ES IST NICHT IN DEN DOCS !!! Das habe ich zumindest gefunden.
quelle