Solución:
No sé cómo hacer esto con el cliente Python o la API de calendario (solo estoy usando una biblioteca ruby OAuth2 para acceder a la API de contactos), pero descubrí que necesitaba solicitar acceso “sin conexión” del usuario.
Esto se hace agregando el parámetro “access_type” con el valor “offline” a la URL de autorización (a la que redirige al usuario para que haga clic en “Quiero permitir que esta aplicación acceda a mis datos”).
Si hace esto, obtiene un refresh_token en su respuesta JSON cuando le pide a Google tokens de acceso. De lo contrario, solo obtiene el token de acceso (que es válido por una hora).
Aparentemente, este requisito se agregó recientemente (y puede que no esté bien documentado).
Solía obtener un token de actualización sin tener que obtener un permiso específico “sin conexión”.
Espero que esto te oriente en la dirección correcta.
Entonces, si ya aceptó el consentimiento sin configurar access_type="offline"
, debe obligar al usuario a dar su consentimiento a su aplicación con acceso sin conexión pasando también approval_prompt="force"
.
self.flow = OAuth2WebServerFlow(
client_id=self.client_id,
client_secret=self.client_secret,
scope=self.SCOPE,
user_agent=user_agent,
redirect_uri='urn:ietf:wg:oauth:2.0:oob',
access_type="offline", # This is the default
approval_prompt="force"
)
Luego puede eliminar el indicador de fuerza / configurarlo en auto
después de obtener el token de actualización.
Las respuestas parecen estar obsoletas a partir de 2017-06-16.
-
approval_prompt
es obsoleto -
prompt=force
no es válido
Aquí hay un ejemplo de trabajo:
from oauth2client.client import OAuth2WebServerFlow
flow = OAuth2WebServerFlow(
client_id=CLIEN_ID,
client_secret=CLIENT_SECRET,
scope=SCOPES,
redirect_uri='http://localhost/gdrive_auth',
access_type="offline",
prompt="consent",
)
print(flow.step1_get_authorize_url())