Estoy tratando de implementar una función de carga de fotos en Google Drive (utilizando la API y el GIS de Google Drive) en una aplicación web en la que estoy trabajando, pero parece que no puedo averiguar cómo mantener a un usuario autenticado por más tiempo que el tiempo de caducidad designado del token de acceso (que es de 1 hora) sin avisar al usuario ni abrir una ventana emergente.
El código de muestra proporcionado en https://github.com/googleworkspace/browser-samples/blob/master/drive/quickstart/index.html obliga al usuario a hacer clic en el botón "actualizar" para obtener un nuevo token, pero esto significa que tendría que obligar a los usuarios a iniciar sesión cada hora, lo cual no es ideal (ya que es probable que los usuarios utilicen la aplicación durante períodos de más de una hora a la vez).
Según https://developers.google.com/identity/oauth2/web/guides/use-token-model#token_expiration , esto parece ser intencional. Sin embargo, después de mirar un poco, descubrí que supuestamente se podría usar un token de actualización para generar un nuevo token de acceso que caduca después de otra hora. Suponiendo que genere un token nuevo cada 45 minutos aproximadamente (que en realidad sugirió otro artículo de Google, pero parece que no puedo encontrarlo ahora), entonces nunca debería preocuparse por esta reautenticación.
Sin embargo, no puedo averiguar cómo obtener un token de actualización.
No recibir el token de actualización de Google OAuth sugiere enviar access_type=offline como un parámetro de consulta, pero no estoy usando ningún redireccionamiento, y la documentación mencionada anteriormente para initTokenClient y requestAccessToken no hace ninguna mención de un parámetro access_type .
Lo más cerca que he estado es llamar al método requestAccessToken periódicamente, pero aún aparece una ventana emergente para que el usuario inicie sesión nuevamente, que es lo que estoy tratando de evitar. Incluso al usar requestAccessToken({ prompt: "" }) aún aparece esta ventana emergente, pero al menos inicia sesión sin ninguna intervención del usuario. ¿Hay alguna forma de desactivar esta ventana emergente por completo?
En el peor de los casos, fuerzo al usuario a volver a autenticarse cada hora, pero parece que esto sería una experiencia de usuario menos que ideal. Cualquier ayuda es apreciada.
Revisé el código de la biblioteca GIS y puedo confirmar que prompt='' y prompt='none' no están implementados como implica la documentación de requestAccessToken. GIS siempre abre una ventana emergente. El parámetro de solicitud solo cambia lo que sucede en la ventana emergente. Tampoco hay funciones de almacenamiento de tokens o almacenamiento en caché en GIS, solo en ventanas emergentes.
El comportamiento actual del parámetro de solicitud se ve por diseño basado en la tabla de comparación de flujo de OAuth 2.0 . El token de acceso debe actualizarse solo cuando el usuario invoca una acción que lo requiera.
Esto nos deja con una experiencia UX bastante horrible en la que la ventana emergente tiene que abrirse y cerrarse brevemente cada hora más o menos. La alternativa es utilizar el flujo de código de autorización. Pero requiere implementar un mecanismo para enviar el token de acceso al lado del cliente desde el backend.
El flujo de botones y el comportamiento de la ventana emergente de consentimiento son intencionales para que los navegadores obtengan un token de acceso, cuando la configuración de la solicitud en una cadena vacía suprimirá la ventana emergente del usuario en cada solicitud: prompt='' .
Adoptar el modelo de código con código de autenticación e intercambiar el token de actualización por el token de acceso es lo que está buscando si desea realizar acciones en nombre del usuario sin que esté presente o sin tener que activar una solicitud de token con un gesto como una pulsación de botón.