Matraz de authlib de Python: ¿cómo manejar el token de actualización?
Solo necesito oauth2 para iniciar sesión hasta ahora, pero creo que, para estar razonablemente completa, mi aplicación aún debería manejar tokens de actualización.
Soy bastante nuevo en oauth, así que aquí está mi entendimiento:
al mantener la vida útil del token de acceso corta, pero la vida útil del token de actualización, obliga al cliente a "registrarse" regularmente para renovar el token de acceso y, por lo tanto, mantener más control.
Pero, ¿cómo hacer eso usando authlib y la integración del matraz?
Parece que no hay refresh_token () en FlaskRemoteApp, y no he podido encontrar ningún código de ejemplo que muestre esto.
Esto parece funcionar para obtener un nuevo token.
res = oauth.myOauth2.fetch_access_token(refresh_token=session['tok_res']['refresh_token'])
session['tok_res'].update(res)
Pero falla cuando se usa posteriormente el nuevo access_token para una llamada a la API.
Supongo que podría ser un error del servidor, o tal vez deba esperar a que caduque el token anterior antes de usar el nuevo. El expires_at time, sigue actualizándose y eso no tiene sentido para mí en ese caso.
Sería genial si alguien pudiera explicar cómo se pretende que refresh_token se use con authlib y flask.
Respuestas
Bueno, a menos que @lepture pase con la respuesta, tengo al menos una respuesta.
Simplemente no estaba grant_type='refresh_token'en mi llamada.
Entonces esto ahora funciona como se esperaba para mí.
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)
Jugué un poco con la configuración de la función update_token en el registro, pero no pude hacer que funcionara. En cualquier caso, creo que esto solo se activa si una llamada a la API que usa el token recibe una respuesta de "token caducado". En mi caso, solo estoy usando Oauth para iniciar sesión, por lo que puedo ver expires_at time y solo presionar el servidor de autenticación cuando sea necesario.