Chcę uzyskać token dostępu od Google. Interfejs API Google mówi, że aby uzyskać token dostępu, wyślij kod i inne parametry na stronę generującą token, a odpowiedzią będzie Obiekt JSON, taki jak:
{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
Nie otrzymuję jednak tokenu odświeżania. W moim przypadku odpowiedź brzmi:
{
"access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}
gdata
gdata-api
access-token
Muhammad Usman
źródło
źródło
Odpowiedzi:
refresh_token
Jest tylko na pierwszej autoryzacji ze strony użytkownika. Późniejsze autoryzacje, takie jak dokonane podczas testowania integracji OAuth2, nie zwrócą gorefresh_token
ponownie. :)refresh_token
(pod warunkiem, że zawiera również parametr zapytania „access_type = offline”).Alternatywnie możesz dodać parametry zapytania
prompt=consent&access_type=offline
do przekierowania OAuth (patrz strona Google OAuth 2.0 dla aplikacji serwera WWW ).Spowoduje to, że użytkownik ponownie autoryzuje aplikację i zawsze zwróci a
refresh_token
.źródło
access_type=offline
we wszystkich przypadkach, kiedy chceszrefresh_token
.$client->setAccessType('offline')
.function setApprovalPrompt()
Został już przekazanyforce
domyślnie.W celu uzyskania odświeżenie tokena trzeba dodać zarówno
approval_prompt=force
iaccess_type="offline"
Jeśli używasz klienta java udostępnianej przez Google będzie wyglądać następująco:źródło
Przeszukałem długą noc, a to załatwia sprawę:
Zmodyfikowano user-example.php z admin-sdk
następnie otrzymasz kod na adres przekierowania i uwierzytelnienie za pomocą kodu i pobranie tokena odświeżania
Powinieneś to teraz zapisać;)
Kiedy twój klucz dostępu przekroczy limit czasu, po prostu zrób to
źródło
To spowodowało pewne zamieszanie, więc pomyślałem, że podzielę się tym, co przyszedłem nauczyć się na własnej skórze:
Gdy poprosisz o dostęp za pomocą parametrów
access_type=offline
iapproval_prompt=force
, powinieneś otrzymać zarówno token dostępu, jak i token odświeżania . Dostęp tokenu wygasa zaraz po otrzymaniu go i będzie trzeba go odświeżyć.Prawidłowo złożyłeś prośbę o uzyskanie nowego tokena dostępu i otrzymałeś odpowiedź z nowym tokenem dostępu . Byłem również zdezorientowany faktem, że nie dostałem nowego tokena odświeżania . Jednak tak właśnie powinno być, ponieważ możesz używać tego samego tokena odświeżania w kółko.
Wydaje mi się, że niektóre inne odpowiedzi zakładają, że z jakiegoś powodu chciałeś zdobyć nowy token odświeżania i zasugerowałem, że ponownie autoryzujesz użytkownika, ale w rzeczywistości nie jest to konieczne, ponieważ token odświeżania będzie działał do odwołany przez użytkownika.
źródło
Odpowiedź Richa Suttona w końcu zadziałała dla mnie, gdy zdałem sobie sprawę, że dodawanie
access_type=offline
odbywa się na żądanie klienta frontonu dotyczące kodu autoryzacji, a nie na żądanie zaplecza, które wymienia ten kod na access_token. Dodałem komentarz do jego odpowiedzi i ten link w Google, aby uzyskać więcej informacji na temat odświeżania tokenów.PS Jeśli używasz Satellizera, oto jak dodać tę opcję do $ authProvider.google w AngularJS .
źródło
Aby je uzyskać
refresh_token
, musisz podaćaccess_type=offline
adres URL żądania OAuth. Gdy użytkownik uwierzytelni się po raz pierwszy, otrzymasz zarówno wartość zerową,refresh_token
jak iaccess_token
wygasającą.Jeśli masz sytuację, w której użytkownik może ponownie uwierzytelnić konto, dla którego masz już token uwierzytelnienia (jak wspomniano powyżej w @SsjCosty), musisz odzyskać informacje od Google, dla którego konta jest token. Aby to zrobić, dodaj
profile
do swoich zakresów. Korzystając z klejnotu Ruby OAuth2, Twoja ostatnia prośba może wyglądać mniej więcej tak:Zauważ, że zakres ma dwa oddzielone spacjami wpisy, jeden dla dostępu tylko do odczytu do Google Analytics, a drugi jest tylko
profile
, który jest standardem OpenID Connect.Spowoduje to, że Google dostarczy dodatkowy atrybut wywoływany
id_token
wget_token
odpowiedzi. Aby uzyskać informacje z id_token, sprawdź tę stronę w dokumentach Google. Istnieje kilka bibliotek dostarczonych przez Google, które sprawdzają i „dekodują” to za Ciebie (użyłem klejnotu Ruby google-id-token ). Po przeanalizowaniusub
parametr ten jest faktycznie unikalnym identyfikatorem konta Google.Warto zauważyć, że jeśli zmienisz zakres, ponownie otrzymasz token odświeżania dla użytkowników, którzy już uwierzytelnili się w oryginalnym zakresie. Jest to przydatne, jeśli, powiedzmy, masz już grupę użytkowników i nie chcesz, aby wszyscy cofnęli autoryzację aplikacji w Google.
Aha, i ostatnia uwaga: nie potrzebujesz
prompt=select_account
, ale jest to przydatne, jeśli masz sytuację, w której użytkownicy mogą chcieć uwierzytelnić się za pomocą więcej niż jednego konta Google (tj. Nie używasz tego do logowania / uwierzytelniania) .źródło
1. Jak zdobyć „refresh_token”?
Rozwiązanie: przy generowaniu authURL należy użyć opcji access_type = 'offline'. źródło: Korzystanie z OAuth 2.0 dla aplikacji serwera WWW
2. Ale nawet z „access_type = offline”, nie otrzymuję „refresh_token”?
Rozwiązanie: pamiętaj, że otrzymasz go tylko na pierwsze żądanie, więc jeśli gdzieś go przechowujesz i istnieje przepis, aby nadpisać ten kod w swoim kodzie podczas uzyskiwania nowego tokena dostępu po upływie poprzedniego okresu, pamiętaj, aby nie zastąpić tej wartości.
Z Google Auth Doc: (ta wartość = typ_dostępu)
Jeśli ponownie potrzebujesz „refresh_token”, musisz usunąć dostęp do swojej aplikacji, wykonując czynności opisane w odpowiedzi Richa Suttona .
źródło
Ustawienie tego spowoduje, że token odświeżania będzie wysyłany za każdym razem:
przykład podano poniżej (php):
źródło
Dla mnie próbowałem
CalendarSampleServlet
dostarczone przez Google. Po 1 godzinie upływa limit czasu dostępu i następuje przekierowanie do strony 401. Próbowałem wszystkich powyższych opcji, ale one nie działały. Wreszcie po sprawdzeniu kodu źródłowego „AbstractAuthorizationCodeServlet” zauważyłem, że przekierowanie zostanie wyłączone, jeśli poświadczenia są obecne, ale najlepiej byłoby sprawdzićrefresh token!=null
. Dodałem poniższy kodCalendarSampleServlet
i potem zadziałało. Wielka ulga po tylu godzinach frustracji. Dzięki Bogu.źródło
teraz Google odrzucił te parametry w moim żądaniu (typ_podpowiedzi, monit) ... :( i nie ma w ogóle przycisku „Odwołaj dostęp”. Jestem frustrujący z powodu odzyskania mojego lol_odświeżania
AKTUALIZACJA: Znalazłem odpowiedź tutaj: D możesz odzyskać token odświeżania przez żądanie https://developers.google.com/identity/protocols/OAuth2WebServer
źródło
źródło
Korzystanie z dostępu offline i monit: zgoda zadziałała dobrze:
źródło
Moje rozwiązanie było trochę dziwne. Próbowałem każdego rozwiązania znalezionego w Internecie i nic. Niespodziewanie to zadziałało: usuń poświadczenia. Json, odśwież, ponownie oblicz aplikację na koncie. Nowy plik credentials.json będzie miał token odświeżania. Utwórz kopię zapasową gdzieś tego pliku. Następnie używaj aplikacji, dopóki błąd tokena odświeżania nie pojawi się ponownie. Usuń plik crendetials.json, który jest teraz tylko z komunikatem o błędzie (w moim przypadku tak się stało), a następnie wklej stary plik poświadczeń do folderu, gotowe! Minął już tydzień, odkąd to zrobiłem i nie miałem już żadnych problemów.
źródło
Aby za każdym razem uzyskiwać nowy token_odświeżania podczas uwierzytelniania, typ poświadczeń OAuth 2.0 utworzonych na pulpicie nawigacyjnym powinien mieć wartość „Inne”. Jak wspomniano powyżej, podczas generowania authURL należy użyć opcji access_type = 'offline'.
Podczas korzystania z poświadczeń typu „Aplikacja internetowa” żadna kombinacja zmiennych zachęty / zatwierdzenia_prompt nie będzie działać - nadal otrzymasz argument_odświeżania tylko na pierwsze żądanie.
źródło