Ciągle invalid_grant
pojawia się błąd podczas próby uzyskania tokena OAuth od Google, aby połączyć się z ich interfejsem API kontaktów. Wszystkie informacje są poprawne i potrójnie to sprawdziłem, więc jestem zaskoczony.
Czy ktoś wie, co może być przyczyną tego problemu? Próbowałem ustawić inny identyfikator klienta, ale otrzymałem ten sam wynik, próbowałem połączyć wiele różnych sposobów, w tym próbę wymuszonego uwierzytelnienia, ale wciąż ten sam wynik.
google-api
André Figueira
źródło
źródło
Odpowiedzi:
Napotkałem ten problem, gdy nie zażądałem wyraźnie dostępu w trybie offline podczas wysyłania użytkownika do protokołu OAuth „Czy chcesz zezwolić tej aplikacji na dotykanie Twoich rzeczy?” strona.
Upewnij się, że w swoim żądaniu określisz access_type = offline.
Szczegóły tutaj: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
(Ponadto: wydaje mi się, że Google dodało to ograniczenie pod koniec 2011 r. Jeśli masz stare tokeny sprzed tego czasu, musisz wysłać swoich użytkowników na stronę uprawnień, aby zezwolić na używanie w trybie offline).
źródło
access_type
naoffline
ten błąd nadal się dzieje.access_type
Napotkałem ten sam problem pomimo określenia „offline” w mojej prośbie zgodnie z odpowiedzią bonkydog. Krótko mówiąc stwierdziłem, że opisane tutaj rozwiązanie działa dla mnie:https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs
Zasadniczo, kiedy dodasz klienta OAuth2 w konsoli Google API, Google poda Ci „Identyfikator klienta” i „Adres e-mail” (zakładając, że jako typ klienta wybierzesz „webapp”). Pomimo wprowadzających w błąd konwencji nazewnictwa Google oczekują, że wyślesz „Adres e-mail” jako wartość
client_id
parametru, gdy uzyskasz dostęp do ich interfejsu API OAuth2.Dotyczy to wywoływania obu tych adresów URL:
Pamiętaj, że wywołanie pierwszego adresu URL powiedzie się, jeśli zadzwonisz do niego przy użyciu swojego „ID klienta” zamiast „adresu e-mail”. Jednak użycie kodu zwróconego z tego żądania nie zadziała podczas próby uzyskania tokenu okaziciela z drugiego adresu URL. Zamiast tego zostanie wyświetlony komunikat „Error 400” i „invalid_grant”.
źródło
Chociaż jest to stare pytanie, wydaje się, że wielu wciąż je napotyka - spędziliśmy wiele dni na śledzeniu tego samodzielnie.
W specyfikacji OAuth2 „invalid_grant” to rodzaj catch-all dla wszystkich błędów związanych z nieprawidłowymi / wygasłymi / unieważnionymi tokenami (token autoryzacji lub odświeżania).
Dla nas problem był dwojaki:
Użytkownik aktywnie odwołał dostęp do naszej aplikacji. Ma to
sens, ale otrzymaj to: 12 godzin po unieważnieniu Google przestaje wysyłać komunikat o błędzie w swojej odpowiedzi:
“error_description” : “Token has been revoked.”
Jest to raczej mylące, ponieważ zakładasz, że komunikat o błędzie jest wyświetlany przez cały czas, co nie jest walizka. Możesz sprawdzić, czy Twoja aplikacja nadal ma dostęp na stronie uprawnień aplikacji .
Użytkownik zresetował / odzyskał swoje hasło Google
W grudniu 2015 r. Firma Google zmieniła swoje domyślne zachowanie, tak aby resetowanie haseł dla użytkowników spoza Google Apps automatycznie unieważniało wszystkie tokeny odświeżania aplikacji użytkownika. W przypadku unieważnienia, komunikat o błędzie jest zgodny z tą samą regułą, co w poprzednim przypadku, więc „opis_błędu” otrzymasz tylko w ciągu pierwszych 12 godzin. Wydaje się, że nie ma sposobu, aby dowiedzieć się, czy użytkownik ręcznie odwołał dostęp (celowo), czy stało się to z powodu resetowania hasła (efekt uboczny).
Oprócz tego istnieje wiele innych potencjalnych przyczyn, które mogą wywołać błąd:
Napisałem krótki artykuł podsumowujący każdy element z pewnymi wskazówkami dotyczącymi debugowania, które pomogą znaleźć winowajcę. Mam nadzieję, że to pomoże.
źródło
Napotkałem ten sam problem. W moim przypadku naprawiłem to, używając adresu e-mail (ciąg kończący się na ... @ developer.gserviceaccount.com) zamiast identyfikatora klienta dla wartości parametru client_id. Nazewnictwo ustawione przez Google jest tutaj mylące.
źródło
Mój problem polegał na tym, że użyłem tego adresu URL:
Kiedy powinienem był użyć tego adresu URL:
To było testowanie konta usługi, które wymagało dostępu offline do silnika pamięci masowej .
źródło
Otrzymałem ten sam komunikat o błędzie „invalid_grant” i było to spowodowane tym, że authResult [„kod”] wysłany z javascript po stronie klienta nie został poprawnie odebrany na serwerze.
Spróbuj wyprowadzić go z powrotem z serwera, aby sprawdzić, czy jest poprawny i czy nie jest to pusty ciąg.
źródło
jeśli używasz biblioteki scribe, po prostu ustaw tryb offline, tak jak sugeruje bonkydog tutaj jest kod:
https://github.com/codolutions/scribe-java/
źródło
Używając Android clientId (no client_secret) otrzymałem następującą odpowiedź o błędzie:
Nie mogę znaleźć żadnej dokumentacji dla pola „code_verifier”, ale odkryłem, że jeśli ustawisz je na równe wartości zarówno w żądaniach autoryzacji, jak i tokenów, usunie to błąd. Nie jestem pewien, jaka powinna być zamierzona wartość lub czy powinna być bezpieczna. Ma jakąś minimalną długość (16 znaków), ale okazało się, że ustawienie
null
również działa.Używam AppAuth do żądania autoryzacji w moim kliencie z Androidem, który ma
setCodeVerifier()
funkcję.Oto przykładowe żądanie tokena w węźle:
Testowałem i to działa zarówno z, jak
https://www.googleapis.com/oauth2/v4/token
ihttps://accounts.google.com/o/oauth2/token
.Jeśli
GoogleAuthorizationCodeTokenRequest
zamiast tego używasz :źródło
To głupia odpowiedź, ale problemem dla mnie było to, że nie zdałem sobie sprawy, że otrzymałem już aktywny token OAuth dla mojego użytkownika Google, którego nie udało mi się zapisać. Rozwiązaniem w tym przypadku jest przejście do konsoli API i zresetowanie klucza tajnego klienta.
Istnieje wiele innych odpowiedzi na SO w tej sprawie, na przykład Reset Client Secret OAuth2 - Czy klienci muszą ponownie przyznać dostęp?
źródło
Może być konieczne usunięcie nieaktualnej / nieprawidłowej odpowiedzi OAuth.
Źródło : próbka node.js google oauth2 przestała działać nieprawidłowy_grant
Uwaga : odpowiedź OAuth również stanie się nieważna, jeśli hasło użyte podczas początkowej autoryzacji zostanie zmienione.
Jeśli jesteś w środowisku bash, możesz użyć następujących metod, aby usunąć przestarzałą odpowiedź:
rm /Users/<username>/.credentials/<authorization.json>
źródło
Istnieją dwa główne powody błędu invalid_grant, na które trzeba uważać przed żądaniem POST o odświeżenie tokena i tokena dostępu.
RFC 6749 OAuth 2.0 zdefiniowano nieprawidłowy_grant jako: Podane nadanie autoryzacji (np. Kod autoryzacji, poświadczenia właściciela zasobów) lub token odświeżania jest nieprawidłowy, wygasł, unieważniony, nie pasuje do identyfikatora URI przekierowania użytego w żądaniu autoryzacji lub został wydany innemu klientowi .
Znalazłem kolejny dobry artykuł, tutaj znajdziesz wiele innych przyczyn tego błędu.
https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35
źródło
Jeśli testujesz to w listonoszu / bezsenności i po prostu próbujesz sprawić, by działało, wskazówka: kod autoryzacji serwera (parametr kodu) jest dobry tylko raz. Oznacza to, że jeśli wypełnisz którykolwiek z innych parametrów w żądaniu i odzyskasz 400, będziesz musiał użyć nowego kodu autoryzacji serwera lub po prostu otrzymasz kolejne 400.
źródło
w tej witrynie console.developers.google.com
ta tablica konsoli wybierz swój projekt wprowadź adres URL przysięgi. adres URL wywołania zwrotnego oauth zostanie przekierowany, gdy zakończy się powodzeniem
źródło
Po rozważeniu i wypróbowaniu wszystkich innych sposobów tutaj, oto jak rozwiązałem problem w nodejs z
googleapis
modułem w połączeniu zrequest
modułem, którego użyłem do pobrania tokenów zamiast dostarczonejgetToken()
metody:Po prostu używam
request
do wysyłania żądania API przez HTTP, jak opisano tutaj: https://developers.google.com/identity/protocols/OAuth2WebServer#offlineźródło
Spróbuj zmienić swój adres URL dla requst na
źródło
Dla przyszłych ludzi ... Czytałem wiele artykułów i blogów, ale miałem szczęście z poniższym rozwiązaniem ...
Ten blog przedstawia różne przypadki, w których pojawia się błąd „invalid_grant”.
Cieszyć się!!!
źródło
dla mnie musiałem się upewnić, że
redirect_uri
jest to dokładne dopasowanie do tego w konsoli programistyAuthorised redirect URIs
, który naprawił to za mnie, byłem w stanie debugować i wiedziałem, na czym dokładnie polega problem po przełączeniu się zhttps://accounts.google.com/o/oauth2/token
nahttps://www.googleapis.com/oauth2/v4/token
Mam poprawny błąd:
źródło
Miałem ten problem po włączeniu nowego interfejsu API usługi w konsoli Google i próbie wykorzystania wcześniej utworzonych poświadczeń.
Aby rozwiązać ten problem, musiałem wrócić do strony danych logowania, klikając na nazwę poświadczeń i kliknięciu przycisku „Zapisz” ponownie . Potem mogłem się uwierzytelnić.
źródło
W moim przypadku problem był w moim kodzie. Przez pomyłkę próbowałem 2 razy zainicjować klienta tymi samymi tokenami. Jeśli żadna z powyższych odpowiedzi nie pomogła, upewnij się, że nie generujesz 2 instancji klienta.
Mój kod przed poprawką:
jak tylko zmienię to na (użyj tylko jednej instancji):
rozwiązało moje problemy z typem grantu.
źródło
Dla mnie problem polegał na tym, że miałem wielu klientów w moim projekcie i jestem prawie pewien, że jest to całkowicie w porządku, ale usunąłem całego klienta dla tego projektu i utworzyłem nowego i wszyscy zaczęli dla mnie pracować (Pomysł z pomocy wtyczki WP_SMTP forum pomocy) Nie mogę znaleźć tego linku w celach informacyjnych
źródło
Jeśli oczyszczasz dane wejściowe użytkownika (na przykład
$_GET["code"]
w php) Upewnij się, że przypadkowo nie zastąpiłeś czegoś w kodzie.Wyrażenie regularne, którego używam, jest teraz
/[^A-Za-z0-9\/-]/
źródło
Spójrz na to https://dev.to/risafj/beginner-s-guide-to-oauth-understanding-access-tokens-and-authorization-codes-2988
Najpierw potrzebujesz access_token:
Zabezpiecz token dostępu i token odświeżania oraz expire_in w bazie danych. Token dostępu wygasa po $ expires_in sekund. Następnie musisz pobrać nowy token dostępu (i zabezpieczyć go w bazie danych) za pomocą następującego żądania:
Pamiętaj, aby dodać domenę redirect_uri do swoich domen w konsoli Google: https://console.cloud.google.com/apis/credentials w zakładce „OAuth 2.0-Client-IDs”. Znajdziesz tam również swój Client-ID i Client-Secret.
źródło
Występuje nieudokumentowany limit czasu między pierwszym przekierowaniem użytkownika na stronę uwierzytelniania Google (i odzyskaniem kodu) a pobraniem zwróconego kodu i wysłaniem go na adres URL tokena. W moim przypadku działa dobrze z rzeczywistym identyfikatorem client_id podanym przez Google, a nie z „nieudokumentowanym adresem e-mail”. Musiałem tylko ponownie rozpocząć proces.
źródło