412 Stimmen

Google OAuth Refresh-Token nicht erhalten

Ich möchte das Zugriffstoken von Google erhalten. Die Google API sagt dass Sie, um das Zugriffs-Token zu erhalten, den Code und andere Parameter an die Token-Generierungsseite senden, und die Antwort wird ein JSON-Objekt sein wie :

{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}

Ich erhalte jedoch das Aktualisierungs-Token nicht. Die Antwort lautet in meinem Fall:

{
 "access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}

992voto

Rich Sutton Punkte 8944

En refresh_token wird nur bei der ersten Autorisierung durch den Benutzer bereitgestellt. Nachfolgende Autorisierungen, wie z. B. die, die Sie beim Testen einer OAuth2-Integration vornehmen, geben nicht die refresh_token wieder. :)

  1. Rufen Sie die Seite mit den Apps auf, die Zugriff auf Ihr Konto haben: https://myaccount.google.com/u/0/permissions .
  2. Wählen Sie unter dem Menü Drittanbieter-Apps Ihre App aus.
  3. Klicken Sie auf Zugriff entfernen und bestätigen Sie dann mit Ok.
  4. Die nächste OAuth2-Anfrage, die Sie stellen, gibt eine refresh_token (vorausgesetzt, sie enthält auch den Abfrageparameter "access_type=offline".

Alternativ können Sie auch die Abfrageparameter hinzufügen prompt=consent&access_type=offline zum OAuth-Redirect (siehe Googles OAuth 2.0 für Webserver-Anwendungen Seite).

Dadurch wird der Benutzer aufgefordert, die Anwendung erneut zu autorisieren, und es wird immer ein refresh_token .

75voto

Gal Morad Punkte 766

Um das Refresh-Token zu erhalten, müssen Sie beide approval_prompt=force y access_type="offline" Wenn Sie den von Google bereitgestellten Java-Client verwenden, sieht er wie folgt aus:

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, JSON_FACTORY, getClientSecrets(), scopes)
            .build();

AuthorizationCodeRequestUrl authorizationUrl =
            flow.newAuthorizationUrl().setRedirectUri(callBackUrl)
                    .setApprovalPrompt("force")
                    .setAccessType("offline");

67voto

Eaten by a Grue Punkte 18900

Ich möchte den frustrierten Seelen, die mit diesem Problem konfrontiert sind, ein paar weitere Informationen zu diesem Thema geben. Der Schlüssel zum Erhalt eines Aktualisierungs-Tokens für eine Offline-App ist es, sicherzustellen, dass Sie die Zustimmungsbildschirm . Die refresh_token wird nur dann zurückgegeben, wenn der Benutzer durch Anklicken von "Zulassen" die Genehmigung erteilt.

enter image description here

Das Problem trat bei mir (und vermutlich bei vielen anderen) auf, nachdem ich einige Tests in einer Entwicklungsumgebung durchgeführt hatte und daher meine Bewerbung bereits genehmigt auf ein bestimmtes Konto. Dann wechselte ich in die Produktion und versuchte, mich erneut mit einem Konto zu authentifizieren, das bereits autorisiert war. In diesem Fall wird der Zustimmungsbildschirm nicht mehr angezeigt und die api gibt kein neues Aktualisierungs-Token zurück . Damit dies funktioniert, müssen Sie die erneute Anzeige des Zustimmungsbildschirms erzwingen, indem Sie entweder:

prompt=consent

o

approval_prompt=force

Beides funktioniert, aber Sie sollten nicht beide verwenden. Ab dem Jahr 2021 empfehle ich die Verwendung von prompt=consent da er den älteren Parameter ersetzt approval_prompt und in einigen Api-Versionen war letzteres sogar kaputt ( https://github.com/googleapis/oauth2client/issues/453 ). Auch, prompt ist eine durch Leerzeichen begrenzte Liste, so dass Sie sie wie folgt festlegen können prompt=select_account%20consent wenn Sie beides wollen.

Natürlich brauchen Sie auch:

access_type=offline

Weitere Lektüre:

33voto

Norbert Punkte 321

Ich habe eine lange Nacht hinter mir, und das hier hilft mir dabei:

Geänderte user-example.php aus admin-sdk

$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$authUrl = $client->createAuthUrl();
echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";

dann erhalten Sie den Code auf der Umleitungsurl und die Authentifizierung mit dem Code und das Aktualisierungs-Token

$client()->authenticate($_GET['code']);
echo $client()->getRefreshToken();

Du solltest es jetzt speichern ;)

Wenn Ihr Schlüssel nicht mehr funktioniert, machen Sie einfach

$client->refreshToken($theRefreshTokenYouHadStored);

23voto

jeteon Punkte 3151

Dies hat bei mir einige Verwirrung gestiftet, so dass ich Ihnen mitteilen möchte, was ich auf die harte Tour gelernt habe:

Wenn Sie den Zugang über die access_type=offline y approval_prompt=force Parameter sollten Sie sowohl eine Zugang Token und ein aktualisieren Zeichen. Die Website Zugang Token läuft kurz nach Erhalt ab und Sie müssen es aktualisieren.

Sie haben zu Recht einen Antrag auf ein neues Zugang Token und erhielt die Antwort mit Ihrer neuen Zugang Token. Verwirrt hat mich auch die Tatsache, dass ich keine neue aktualisieren Zeichen. Dies ist jedoch so gewollt, da Sie denselben Token verwenden können. aktualisieren immer und immer wieder.

Ich denke, einige der anderen Antworten gehen davon aus, dass Sie sich ein neues Auto zulegen wollen. aktualisieren Token aus irgendeinem Grund und schlug vor, den Benutzer erneut zu autorisieren, aber in Wirklichkeit ist das nicht nötig, da die aktualisieren Token funktioniert so lange, bis es vom Benutzer widerrufen wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X