Python authlib flask - como lidar com token de atualização?

Oct 25 2020

Eu só preciso do oauth2 para login até agora, mas acho que para ser razoavelmente completo, meu aplicativo ainda deve lidar com tokens de atualização.

Eu sou bastante novo no oauth, então aqui está o meu entendimento:
mantendo o tempo de vida do token de acesso curto, mas o tempo de vida do token de atualização longa, você força o cliente a "verificar" regularmente para renovar o token de acesso e, assim, manter mais controle.

Mas como realmente fazer isso usando authlib e a integração do frasco?
Parece não haver refresh_token () no FlaskRemoteApp e não consegui encontrar nenhum código de exemplo mostrando isso.

Isso parece funcionar para obter um novo token

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

Mas falha ao usar subsequentemente o novo access_token para uma chamada de API.
Pode ser um erro de servidor, suponho, ou talvez eu precise esperar que o token antigo expire antes de usar o novo? O expires_at time, continua atualizando e isso não faz sentido para mim nesse caso.

Seria ótimo se alguém pudesse explicar como o refresh_token deve ser usado com authlib e flask.

Respostas

1 Alias_Knagg Nov 03 2020 at 11:16

Bem, a menos que @lepture apareça com a resposta, eu tenho pelo menos uma resposta.
Eu estava simplesmente faltando grant_type='refresh_token'na minha ligação.
Portanto, agora funciona conforme o esperado para mim.

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)

Eu brinquei um pouco com a configuração da função update_token no registro, mas não fui capaz de fazê-la funcionar. Em qualquer caso, acredito que isso só é acionado se uma chamada de API usando o token receber uma resposta de "token expirado". No meu caso, estou usando apenas o Oauth para login, então posso apenas observar o tempo expires_at e acessar o servidor de autenticação apenas quando necessário.