Python authlib flask - jak obsłużyć refresh token?
Jak dotąd potrzebuję tylko oauth2 do logowania, ale uważam, że aby być w miarę kompletnym, moja aplikacja powinna nadal obsługiwać tokeny odświeżania.
Jestem całkiem nowy w Oauth, więc rozumiem:
utrzymując krótki okres istnienia tokenu dostępu, ale odświeżając go długo, zmuszasz klienta do regularnego „sprawdzania”, aby odnowić token dostępu, a tym samym zachować większą kontrolę.
Ale jak właściwie to zrobić, używając authlib i integracji kolb?
Wygląda na to, że na FlaskRemoteApp nie ma refresh_token () i nie mogłem znaleźć żadnego przykładowego kodu, który to pokazuje.
Wydaje się, że działa to w celu uzyskania nowego tokena
res = oauth.myOauth2.fetch_access_token(refresh_token=session['tok_res']['refresh_token'])
session['tok_res'].update(res)
Ale kończy się niepowodzeniem, gdy później używa się nowego access_token do wywołania interfejsu API.
Może to być błąd serwera, a może muszę poczekać, aż stary token wygaśnie, zanim użyję nowego? Czas expires_at, jest aktualizowany i nie ma to dla mnie sensu w tym przypadku.
Byłoby wspaniale, gdyby ktoś mógł wyjaśnić, w jaki sposób refresh_token ma być używany z authlib i flask.
Odpowiedzi
No chyba, że @lepture wpada z tej odpowiedzi, mam przynajmniej o odpowiedź.
Po prostu brakowało grant_type='refresh_token'mi rozmowy.
Więc teraz działa to zgodnie z oczekiwaniami.
if session['oatoken']['expires_at'] - 2 < now: # refresh 2 seconds early
oatoken = oauth.myOauth2.fetch_access_token(
refresh_token=session['oatoken']['refresh_token'],
grant_type='refresh_token')
session['oatoken'].update(oatoken)
Bawiłem się trochę ustawieniem funkcji update_token w rejestrze, ale nie udało mi się to zrobić. W każdym razie uważam, że jest to wyzwalane tylko wtedy, gdy wywołanie interfejsu API korzystające z tokena otrzyma odpowiedź „wygasły token”. W moim przypadku używam Oauth tylko do logowania, więc mogę po prostu obserwować czas expires_at i trafiać na serwer autoryzacji tylko wtedy, gdy jest to konieczne.