Flask Python authlib: come gestire il token di aggiornamento?
Finora ho solo bisogno di oauth2 per il login, ma ritengo che per essere ragionevolmente completo, la mia app dovrebbe comunque gestire i token di aggiornamento.
Sono abbastanza nuovo a oauth, quindi ecco la mia comprensione:
mantenendo la durata del token di accesso breve, ma la durata del token di aggiornamento lunga, costringi il client a "eseguire il check-in" regolarmente per rinnovare il token di accesso e quindi mantenere un maggiore controllo.
Ma come farlo effettivamente usando authlib e l'integrazione del flask?
Sembra che non ci sia refresh_token () su FlaskRemoteApp e non sono stato in grado di trovare alcun codice di esempio che lo mostri.
Questo sembra funzionare per ottenere un nuovo token
res = oauth.myOauth2.fetch_access_token(refresh_token=session['tok_res']['refresh_token'])
session['tok_res'].update(res)
Ma non riesce quando successivamente si utilizza il nuovo access_token per una chiamata api.
Potrebbe essere un errore del server, suppongo, o forse devo aspettare che il vecchio token scada prima di utilizzare quello nuovo? Il expires_at time, continua ad aggiornarsi e questo non ha senso per me in quel caso.
Sarebbe bello se qualcuno potesse spiegare come si intende utilizzare refresh_token con authlib e flask.
Risposte
Bene, a meno che @lepture non passi con la risposta, ho almeno una risposta.
Semplicemente mi mancava la grant_type='refresh_token'mia chiamata.
Quindi ora funziona come previsto per me.
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)
Ho giocato un po 'con l'impostazione della funzione update_token nel registro, ma non sono riuscito a farlo funzionare. In ogni caso, credo che questo venga attivato solo se una chiamata api che utilizza il token riceve una risposta "token scaduto". Nel mio caso sto usando Oauth solo per il login, quindi posso semplicemente guardare expires_at time e premere il server di autenticazione solo quando necessario.