google-api bad - invalid_grant versucht, oAuth-Token von Google zu erhalten




request malformed (13)

Ich invalid_grant immer einen invalid_grant Fehler beim Versuch, ein oAuth-Token von Google zu erhalten, um eine Verbindung zu ihren Kontakten herzustellen. Alle Informationen sind korrekt und ich habe es dreifach überprüft.

Weiß jemand, was dieses Problem verursachen könnte? Ich habe versucht, eine andere Client-ID für es einzurichten, aber ich bekomme das gleiche Ergebnis, ich habe versucht, viele verschiedene Möglichkeiten, einschließlich der Kraft Authentifizierung, aber immer noch das gleiche Ergebnis zu verbinden.


Answers

Mein Problem war, dass ich diese URL verwendet habe:

https://accounts.google.com/o/oauth2/token

Wann hätte ich diese URL verwenden sollen:

https://www.googleapis.com/oauth2/v4/token

Dies war das Testen eines Dienstkontos, das offline auf die Speicher-Engine zugreifen wollte.


Mit einer Android clientId (no client_secret) erhalte ich folgende Fehlermeldung:

{
 "error": "invalid_grant",
 "error_description": "Missing code verifier."
}

Ich kann keine Dokumentation für das Feld 'code_verifier' finden, aber ich habe festgestellt, dass dieser Fehler behoben wird, wenn Sie ihn in den Autorisierungs- und Token-Anfragen auf gleiche Werte setzen. Ich bin mir nicht sicher, was der beabsichtigte Wert sein sollte oder ob es sicher sein sollte. Es hat eine minimale Länge (16 Zeichen), aber ich fand Einstellung auf null funktioniert auch.

Ich verwende AppAuth für die Autorisierungsanfrage in meinem Android-Client, der eine setCodeVerifier() Funktion hat.

AuthorizationRequest authRequest = new AuthorizationRequest.Builder(
                                    serviceConfiguration,
                                    provider.getClientId(),
                                    ResponseTypeValues.CODE,
                                    provider.getRedirectUri()
                            )
                            .setScope(provider.getScope())
                            .setCodeVerifier(null)
                            .build();

Hier ist eine Beispiel-Token-Anfrage im Knoten:

request.post(
  'https://www.googleapis.com/oauth2/v4/token',
  { form: {
    'code': '4/xxxxxxxxxxxxxxxxxxxx',
    'code_verifier': null,
    'client_id': 'xxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
    'client_secret': null,
    'redirect_uri': 'com.domain.app:/oauth2redirect',
    'grant_type': 'authorization_code'
  } },
  function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log('Success!');
    } else {
      console.log(response.statusCode + ' ' + error);
    }

    console.log(body);
  }
);

Ich habe getestet und dies funktioniert sowohl mit https://www.googleapis.com/oauth2/v4/token als auch mit https://accounts.google.com/o/oauth2/token .

Wenn Sie stattdessen GoogleAuthorizationCodeTokenRequest verwenden:

final GoogleAuthorizationCodeTokenRequest req = new GoogleAuthorizationCodeTokenRequest(
                    TRANSPORT,
                    JSON_FACTORY,
                    getClientId(),
                    getClientSecret(),
                    code,
                    redirectUrl
);
req.set("code_verifier", null);          
GoogleTokenResponse response = req.execute();

Wenn Sie die Scribe-Bibliothek verwenden, richten Sie einfach den Offline-Modus ein. Wie hier vorgeschlagen, ist bonkydog der Code:

OAuthService service = new ServiceBuilder().provider(Google2Api.class).apiKey(clientId).apiSecret(apiSecret)
                .callback(callbackUrl).scope(SCOPE).offline(true)
                .build();

https://github.com/codolutions/scribe-java/


Ich hatte die gleiche Fehlermeldung 'invalid_grant' und es war, weil die authResult ['code'] von Client-Seite senden Javascript wurde nicht korrekt auf dem Server empfangen.

Versuchen Sie, es vom Server zurückzugeben, um zu sehen, ob es korrekt ist und nicht eine leere Zeichenfolge.


Obwohl dies eine alte Frage ist, scheint es, als würden viele immer noch auf sie stoßen - wir verbrachten diese Tage selbst tagelang.

In der OAuth2-Spezifikation ist "invalid_grant" eine Art Catch-all für alle Fehler in Bezug auf ungültige / abgelaufene / widerrufene Token (Auth Grant- oder Refresh-Token).

Für uns war das Problem zweifach:

  1. Der Nutzer hat den Zugriff auf unsere App aktiv widerrufen
    Sinnvoll, aber erhalten Sie das: 12 Stunden nach Widerruf, stoppt Google Senden der Fehlermeldung in ihrer Antwort: “error_description” : “Token has been revoked.”
    Es ist eher irreführend, weil Sie davon ausgehen, dass die Fehlermeldung immer da ist, was nicht der Fall ist. Sie können überprüfen, ob Ihre App auf der Berechtigungsseite für Apps weiterhin Zugriff hat.

  2. 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-Refresh-Token des Nutzers widerruft. Bei der Widerrufung folgt die Fehlermeldung der gleichen Regel wie zuvor, so dass Sie nur die "error_description" 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 aufgrund eines Passwortzurücksetzens (Nebeneffekt).

Abgesehen von diesen gibt es eine Vielzahl anderer möglicher Ursachen, die den Fehler auslösen könnten:

  1. Serveruhr / Zeit ist nicht synchron
  2. Nicht für den Offline-Zugriff autorisiert
  3. Gedrosselt von Google
  4. Verwenden abgelaufener Aktualisierungstoken
  5. Der Benutzer ist seit 6 Monaten inaktiv
  6. Verwenden Sie Service-Mitarbeiter-E-Mail anstelle der Client-ID
  7. Zu viele Zugriffstoken in kurzer Zeit
  8. Das Client-SDK ist möglicherweise veraltet
  9. Falsches / unvollständiges Aktualisierungstoken

Ich habe einen kurzen Artikel verfasst , in dem jeder Artikel mit Hilfe von Debugging-Anleitungen zusammengefasst wurde, um den Schuldigen zu finden. Ich hoffe es hilft.


Möglicherweise müssen Sie eine veraltete / ungültige OAuth-Antwort entfernen.

Gutschrift: node.js google oauth2 Probe hörte auf, invalid_grant zu arbeiten

Hinweis : Eine OAuth-Antwort wird auch ungültig, wenn das in der anfänglichen Autorisierung verwendete Kennwort geändert wurde.

Wenn Sie in einer Bash-Umgebung die abgestandene Antwort entfernen können, verwenden Sie Folgendes:

rm /Users/<username>/.credentials/<authorization.json>


Ich stieß auf dasselbe Problem, obwohl ich den "offline" access_type in meiner Anfrage entsprechend der Antwort von bonkydog spezifizierte. Lange Rede kurzer Sinn Ich fand, dass die hier beschriebene Lösung für mich funktionierte:

https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs

Wenn Sie in Ihrer Google API-Konsole einen OAuth2-Client hinzufügen, erhalten Sie von Google eine "Client-ID" und eine "E-Mail-Adresse" (vorausgesetzt, Sie wählen "webapp" als Clienttyp aus). Und trotz der irreführenden Namenskonventionen von Google erwarten sie, dass Sie die "E-Mail-Adresse" als Wert des Parameters client_id , wenn Sie auf ihre OAuth2-APIs zugreifen.

Dies gilt, wenn Sie beide URLs aufrufen:

Beachten Sie, dass der Aufruf der ersten URL erfolgreich ist, wenn Sie ihn mit Ihrer "Client-ID" anstelle Ihrer "E-Mail-Adresse" aufrufen. Die Verwendung des von dieser Anforderung zurückgegebenen Codes funktioniert jedoch nicht, wenn versucht wird, ein Bearer-Token von der zweiten URL abzurufen. Stattdessen erhalten Sie eine 'Error 400' und eine 'invalid_grant' Nachricht.


Versuchen Sie, Ihre URL zu ändern

https://www.googleapis.com/oauth2/v4/token

Das ist eine dumme Antwort, aber das Problem für mich war, dass ich nicht erkannte, dass ich bereits einen aktiven oAuth-Token für meinen Google-Nutzer erhalten hatte, den ich nicht speichern konnte. Die Lösung besteht in diesem Fall darin, zur API-Konsole zu gehen und das Client-Geheimnis zurückzusetzen.

Zu diesem Zweck gibt es zahlreiche andere Antworten zu SO, zum Beispiel Reset Client Secret OAuth2 - Müssen Clients den Zugriff wieder gewähren?


Ich stieß auf das gleiche Problem. Für mich habe ich dies behoben, indem ich E-Mail-Adresse (die Zeichenfolge, die mit ... @ developer.gserviceaccount.com endet) anstelle von Client-ID für client_id-Parameterwert verwendet. Die Benennung von Google ist hier verwirrend.


auf dieser Website console.developers.google.com

Diese Konsole Board wählen Sie Ihr Projekt geben Sie die Eide URL. Die OAUTH Callback URL wird umgeleitet, wenn der OAUTH erfolgreich ist


Ich bin auf dieses Problem gestoßen, als ich den "Offline" -Zugriff nicht explizit angefordert habe, als ich den Benutzer zum OAuth geschickt habe. "Möchtest du dieser App erlauben, deine Inhalte zu berühren?" Seite.

Stellen Sie sicher, dass Sie in Ihrer Anfrage access_type = offline angeben.

Details finden Sie hier: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

(Außerdem glaube ich, dass Google diese Einschränkung Ende 2011 hinzugefügt hat. Wenn Sie alte Token von früher haben, müssen Sie Ihre Nutzer auf die Berechtigungsseite senden, um die Offline-Nutzung zu autorisieren.)


Sie können die benutzerdefinierte Suchmaschine "Everywhere" direkt auf der Startseite von Google Custom Search ( http://www.google.com/cse/ ) erstellen. Sie sollten nur auf "Erweitert" klicken, während Sie eine neue Engine hinzufügen. Dort können Sie den Site-Typ Schema.org angeben. " Thing " ist der allgemeinste Typ, der das gesamte Web abdeckt.





google-api