Flacon Python Authlib - Comment gérer le jeton d'actualisation?

Oct 25 2020

Je n'ai besoin que de oauth2 pour la connexion jusqu'à présent, mais je pense que pour être raisonnablement complète, mon application doit toujours gérer les jetons d'actualisation.

Je suis assez nouveau dans oauth, donc voici ce que je comprends:
en gardant la durée de vie du jeton d'accès courte, mais en actualisant la durée de vie du jeton, vous forcez le client à «s'enregistrer» régulièrement pour renouveler le jeton d'accès, et ainsi maintenir plus de contrôle.

Mais comment faire cela en utilisant authlib et l'intégration de flask?
Il ne semble pas y avoir de refresh_token () sur FlaskRemoteApp, et je n'ai pas pu trouver d'exemple de code montrant cela.

Cela semble fonctionner pour obtenir un nouveau jeton

res = oauth.myOauth2.fetch_access_token(refresh_token=session['tok_res']['refresh_token'])
session['tok_res'].update(res)

Mais échoue lors de l'utilisation ultérieure du nouveau access_token pour un appel API.
Il peut s'agir d'une erreur de serveur, je suppose, ou peut-être que je dois attendre l'expiration de l'ancien jeton avant d'utiliser le nouveau? L'heure expires_at se met à jour et cela n'a aucun sens pour moi dans ce cas.

Ce serait formidable si quelqu'un pouvait expliquer comment refresh_token est destiné à être utilisé avec authlib et flask.

Réponses

1 Alias_Knagg Nov 03 2020 at 11:16

Eh bien, à moins que @lepture ne passe avec la réponse, j'ai au moins une réponse.
J'étais simplement absent grant_type='refresh_token'de mon appel.
Donc, cela fonctionne maintenant comme prévu pour moi.

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)

J'ai joué un peu avec la configuration de la fonction update_token dans le registre, mais je n'ai pas pu la faire fonctionner. Dans tous les cas, je crois que cela n'est déclenché que si un appel API utilisant le jeton reçoit une réponse "jeton expiré". Dans mon cas, j'utilise uniquement Oauth pour la connexion, je peux donc simplement regarder l'heure expires_at et ne toucher le serveur d'authentification que lorsque cela est nécessaire.