Ich erhalte immer wieder eine invalid_grant
Fehlermeldung, wenn ich versuche, ein oAuth-Token von Google zu erhalten, um eine Verbindung zu deren Kontakt-API herzustellen. Alle Informationen sind korrekt und ich habe dreifach überprüft, dass dies so verblüfft ist.
Weiß jemand, was dieses Problem verursachen kann? Ich habe versucht, eine andere Client-ID dafür einzurichten, aber ich erhalte das gleiche Ergebnis. Ich habe versucht, viele verschiedene Möglichkeiten zu verbinden, einschließlich des Erzwingens der erzwungenen Authentifizierung, aber immer noch das gleiche Ergebnis.
google-api
André Figueira
quelle
quelle
Antworten:
Ich bin auf dieses Problem gestoßen, als ich beim Senden des Benutzers an die OAuth nicht explizit den "Offline" -Zugriff angefordert habe. "Möchten Sie dieser App die Erlaubnis geben, Ihre Inhalte zu berühren?" Seite.
Stellen Sie sicher, dass Sie in Ihrer Anfrage access_type = offline angeben.
Details hier: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
(Außerdem: Ich denke, Google hat diese Einschränkung Ende 2011 hinzugefügt. Wenn Sie bereits alte Token haben, müssen Sie Ihre Benutzer auf die Berechtigungsseite senden, um die Offline-Verwendung zu autorisieren.)
quelle
access_type
aufoffline
, dieser Fehler immer noch geschieht.Ich bin auf dasselbe Problem
access_type
gestoßen, obwohl ich in meiner Anfrage das "Offline" gemäß der Antwort von bonkydog angegeben habe. Kurz gesagt, ich habe festgestellt, dass die hier beschriebene Lösung für mich funktioniert:https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs
Wenn Sie einen OAuth2-Client in die Konsole Ihrer Google API einfügen, erhalten Sie von Google im Wesentlichen eine "Client-ID" und eine "E-Mail-Adresse" (vorausgesetzt, Sie wählen "Webapp" als Client-Typ aus). Und trotz der irreführenden Namenskonventionen von Google wird erwartet, dass Sie die "E-Mail-Adresse" als Wert des
client_id
Parameters senden, wenn Sie auf die OAuth2-APIs zugreifen.Dies gilt, wenn Sie beide URLs aufrufen:
Beachten Sie, dass der Aufruf der ersten URL erfolgreich ist, wenn Sie sie mit Ihrer "Kunden-ID" anstelle Ihrer "E-Mail-Adresse" aufrufen. Die Verwendung des von dieser Anforderung zurückgegebenen Codes funktioniert jedoch nicht, wenn versucht wird, ein Inhaber-Token von der zweiten URL abzurufen. Stattdessen erhalten Sie eine 'Fehler 400' und eine "invalid_grant" Nachricht.
quelle
Obwohl dies eine alte Frage ist, scheinen viele noch immer darauf zu stoßen - wir haben Tage damit verbracht, dies selbst aufzuspüren.
In der OAuth2-Spezifikation ist "invalid_grant" eine Art Sammelbegriff für alle Fehler im Zusammenhang mit ungültigen / abgelaufenen / widerrufenen Token (Auth Grant oder Refresh Token).
Für uns gab es zwei Probleme:
Der Nutzer hat den Zugriff auf unsere App aktiv widerrufen.
Sinnvoll, aber erhalten Sie Folgendes: 12 Stunden nach dem Widerruf sendet Google die Fehlermeldung nicht mehr in seiner Antwort:
“error_description” : “Token has been revoked.”
Es ist eher irreführend, da Sie davon ausgehen, dass die Fehlermeldung jederzeit vorhanden ist, was nicht der Fall ist der Fall. Auf der Berechtigungsseite für Apps können Sie überprüfen, ob Ihre App noch Zugriff hat .
Der Nutzer hat sein Google-Passwort zurückgesetzt / wiederhergestellt
Im Dezember 2015 hat Google sein Standardverhalten geändert, sodass das Zurücksetzen des Passworts für Nicht-Google Apps-Nutzer automatisch alle Apps-Aktualisierungstoken des Nutzers widerruft. Beim Widerruf folgt die Fehlermeldung der gleichen Regel wie zuvor, sodass Sie die "error_description" erst in den ersten 12 Stunden erhalten. Es scheint keine Möglichkeit zu geben, zu wissen, ob der Benutzer den Zugriff manuell widerrufen hat (absichtlich) oder ob dies aufgrund eines Zurücksetzens des Kennworts geschehen ist (Nebeneffekt).
Abgesehen von diesen gibt es eine Vielzahl anderer möglicher Ursachen, die den Fehler auslösen könnten:
Ich habe einen kurzen Artikel geschrieben, in dem die einzelnen Elemente mit einigen Debugging-Anleitungen zusammengefasst sind, um den Schuldigen zu finden. Ich hoffe es hilft.
quelle
Ich bin auf das gleiche Problem gestoßen. Für mich habe ich dies behoben, indem ich anstelle der Client-ID für den Parameterwert client_id die E-Mail-Adresse (die Zeichenfolge, die mit ... @ developer.gserviceaccount.com endet) verwendet habe. Die von Google festgelegte Benennung ist hier verwirrend.
quelle
Mein Problem war, dass ich diese URL verwendet habe:
Wann hätte ich diese URL verwenden sollen:
Hiermit wurde ein Dienstkonto getestet, das Offline-Zugriff auf die Speicher-Engine wünschte .
quelle
Ich hatte die gleiche Fehlermeldung 'invalid_grant' und das lag daran, dass das von clientseitigem Javascript gesendete authResult ['code'] auf dem Server nicht korrekt empfangen wurde.
Versuchen Sie, es vom Server zurückzugeben, um festzustellen, ob es korrekt ist und keine leere Zeichenfolge.
quelle
Wenn Sie eine Schreibbibliothek verwenden, richten Sie einfach den Offline-Modus ein. Bonkydog schlägt hier den folgenden Code vor:
https://github.com/codolutions/scribe-java/
quelle
Bei Verwendung einer Android-Client-ID (kein client_secret) wurde die folgende Fehlerantwort angezeigt:
Ich kann keine Dokumentation für das Feld 'code_verifier' finden, aber ich habe festgestellt, dass dieser Fehler behoben wird, wenn Sie es sowohl in der Autorisierungs- als auch in der Token-Anforderung auf gleiche Werte setzen. Ich bin nicht sicher, was der beabsichtigte Wert sein soll oder ob er sicher sein soll. Es hat eine Mindestlänge (16? Zeichen), aber ich fand, dass die Einstellung
null
auch funktioniert.Ich verwende AppAuth für die Autorisierungsanforderung in meinem Android-Client, der eine
setCodeVerifier()
Funktion hat.Hier ist ein Beispiel für eine Tokenanforderung im Knoten:
Ich habe getestet und das funktioniert mit beiden
https://www.googleapis.com/oauth2/v4/token
undhttps://accounts.google.com/o/oauth2/token
.Wenn Sie
GoogleAuthorizationCodeTokenRequest
stattdessen verwenden:quelle
Dies ist eine dumme Antwort, aber das Problem für mich war, dass ich nicht realisierte, dass mir bereits ein aktives oAuth-Token für meinen Google-Nutzer ausgestellt wurde, das ich nicht speichern konnte. In diesem Fall besteht die Lösung darin, zur API-Konsole zu gehen und das Client-Geheimnis zurückzusetzen.
Zu diesem Zweck gibt es zahlreiche andere Antworten auf SO, z. B. Client Secret OAuth2 zurücksetzen - Müssen Clients den Zugriff erneut gewähren?
quelle
Möglicherweise müssen Sie eine veraltete / ungültige OAuth-Antwort entfernen.
Credit: node.js google oauth2 sample funktioniert nicht mehr invalid_grant
Hinweis : Eine OAuth-Antwort wird auch ungültig, wenn das in der Erstautorisierung verwendete Kennwort geändert wurde.
In einer Bash-Umgebung können Sie die veraltete Antwort wie folgt entfernen:
rm /Users/<username>/.credentials/<authorization.json>
quelle
Es gibt zwei Hauptgründe für den Fehler invalid_grant , die Sie vor der POST-Anforderung für das Aktualisierungstoken und das Zugriffstoken berücksichtigen müssen.
RFC 6749 OAuth 2.0 hat invalid_grant wie folgt definiert : Die bereitgestellte Berechtigungsgewährung (z. B. Berechtigungscode, Anmeldeinformationen des Ressourcenbesitzers) oder das Aktualisierungstoken ist ungültig, abgelaufen, widerrufen, stimmt nicht mit dem in der Autorisierungsanforderung verwendeten Umleitungs-URI überein oder wurde an einen anderen Client ausgegeben .
Ich habe einen weiteren guten Artikel gefunden, hier finden Sie viele andere Gründe für diesen Fehler.
https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35
quelle
auf dieser Site console.developers.google.com
Diese Konsolenplatine wählt Ihr Projekt aus und gibt die Eid-URL ein. Die oauth-Rückruf-URL wird umgeleitet, wenn der oauth-Erfolg erfolgreich ist
quelle
Nach Prüfung und hier alle anderen Möglichkeiten versuchen , hier ist, wie ich das Problem in NodeJS mit dem gelöst
googleapis
Modul in Verbindung mit demrequest
Modul, das ich zu holen verwendet , um die Stelle der bereitgestellten Token -getToken()
Methode:Ich verwende einfach
request
, um die API-Anfrage über HTTP zu stellen, wie hier beschrieben: https://developers.google.com/identity/protocols/OAuth2WebServer#offlinequelle
Versuchen Sie, Ihre URL für erforderlich zu ändern
quelle
Für zukünftige Leute ... Ich habe viele Artikel und Blogs gelesen, hatte aber Glück mit der Lösung unten ...
Dieser Blog zeigt verschiedene Fälle, in denen der Fehler "invalid_grant" auftritt.
Genießen!!!
quelle
Für mich musste ich sicherstellen, dass das
redirect_uri
genau mit dem in der Entwicklerkonsole übereinstimmt, dasAuthorised redirect URIs
es für mich behoben hat. Ich konnte nach dem Wechsel vonhttps://accounts.google.com/o/oauth2/token
zu debuggen und wissen, was genau das Problem warhttps://www.googleapis.com/oauth2/v4/token
Ich habe einen richtigen Fehler erhalten:
quelle
Ich hatte dieses Problem, nachdem ich eine neue Dienst-API auf der Google-Konsole aktiviert und versucht hatte, die zuvor erstellten Anmeldeinformationen zu verwenden.
Um das Problem zu beheben, musste ich auf die Berechtigung Seite zurückzukehren, auf dem Berechtigungsnachweis Namen klicken, und klicken Sie auf „Speichern“ wieder . Danach konnte ich mich gut authentifizieren.
quelle
In meinem Fall war das Problem in meinem Code. Ich habe fälschlicherweise zweimal versucht, den Client mit denselben Token zu initiieren. Wenn keine der oben genannten Antworten dazu beigetragen hat, stellen Sie sicher, dass Sie keine 2 Instanzen des Clients generieren.
Mein Code vor dem Fix:
sobald ich es ändere auf (benutze nur eine Instanz):
Es hat meine Probleme mit dem Grant-Typ behoben.
quelle
Für mich bestand das Problem darin, dass ich mehrere Clients in meinem Projekt hatte und ich bin mir ziemlich sicher, dass dies vollkommen in Ordnung ist, aber ich habe den gesamten Client für dieses Projekt gelöscht und einen neuen erstellt und alle haben begonnen, für mich zu arbeiten (Ich habe diese Idee für die WP_SMTP-Plugin-Hilfe erhalten Support-Forum) Ich kann diesen Link nicht als Referenz finden
quelle
Wenn Sie Benutzereingaben bereinigen (z. B.
$_GET["code"]
in PHP) Stellen Sie sicher, dass Sie nicht versehentlich etwas im Code ersetzen.Der Regex, den ich benutze, ist jetzt
/[^A-Za-z0-9\/-]/
quelle
Schauen Sie sich diese https://dev.to/risafj/beginner-s-guide-to-oauth-understanding-access-tokens-and-authorization-codes-2988 an
Zuerst benötigen Sie ein access_token:
Sichern Sie das Zugriffstoken und das Aktualisierungstoken sowie das expire_in in einer Datenbank. Das Zugriffstoken läuft nach $ expires_in Sekunden ab. Dann müssen Sie ein neues Zugriffstoken mit der folgenden Anforderung abrufen (und in der Datenbank sichern):
Denken Sie daran, die Domain redirect_uri Ihren Domains in Ihrer Google-Konsole hinzuzufügen: https://console.cloud.google.com/apis/credentials auf der Registerkarte "OAuth 2.0-Client-IDs". Dort finden Sie auch Ihre Client-ID und Client-Secret.
quelle
Es gibt eine undokumentierte Zeitüberschreitung zwischen der ersten Umleitung des Nutzers zur Google-Authentifizierungsseite (und der Rückgabe eines Codes) und der Annahme des zurückgegebenen Codes und der Veröffentlichung an die Token-URL. Es funktioniert gut für mich mit der tatsächlich von Google bereitgestellten client_id im Gegensatz zu einer "undokumentierten E-Mail-Adresse". Ich musste den Prozess nur erneut starten.
quelle
Wenn Sie dies in Postman / Insomnia testen und nur versuchen, es zum Laufen zu bringen, geben Sie an: Der Serverauthentifizierungscode (Codeparameter) ist nur einmal gut. Das heißt, wenn Sie einen der anderen Parameter in der Anforderung ausfüllen und eine 400 zurückerhalten, müssen Sie einen neuen Serverauthentifizierungscode verwenden, oder Sie erhalten nur eine weitere 400.
quelle