es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Acceda a las APIs de Google sin necesidad de tener acceso a un navegador web.

Estoy configurando una cuenta automatizada de Gmail que será capaz de recibir, analizar y enviar correos electrónicos, así como tener cierto acceso a los calendarios de los usuarios de Google. Siguiendo la guía de inicio rápido de Google para la autorización, logré hacer funcionar todas las funcionalidades necesarias. El problema es que requiere visitar una URL para otorgar permisos al programa. No es un problema cuando se desarrolla localmente, pero esto se implementará en un droplet Debian sin GUI ni navegador. Supongo que esto se podría manejar mediante Selenium o Puppeteer, pero debe haber una manera mejor.

He investigado sobre la autorización del lado del servidor de Google, pero parece que también implica visitar una URL. También he encontrado cuentas de servicio, pero parece haber algunas preocupaciones sobre qué APIs pueden acceder y no estoy seguro si es la opción correcta para mí.

Aquí están los ámbitos que estoy utilizando:

https://www.googleapis.com/auth/calendar
https://www.googleapis.com/auth/gmail.readonly
https://mail.google.com/

¿Funcionará una cuenta de servicio para mí? Si no es así, ¿qué ruta debería tomar?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como has mencionado, las cuentas de servicio se pueden usar para autenticar y autorizar las API de Google de forma programática. Sin embargo, las cuentas de servicio están destinadas a interacciones entre servidores y no pueden, por sí solas, acceder a los datos del usuario, como Google Calendar o Gmail. Si deseas acceder a los datos del usuario, aún necesitarás obtener el consentimiento de los usuarios.

    En tu caso, dado que estás trabajando en un entorno sin interfaz gráfica, una posible solución es usar el flujo de OAuth 2.0 para aplicaciones en el lado del servidor, también conocido como flujo de “OAuth de tres patas”. Esto implica obtener el consentimiento del usuario redirigiéndolos a una pantalla de consentimiento donde pueden otorgar acceso a sus datos a tu aplicación. A diferencia del enfoque de inicio rápido, este flujo no requiere interacción del usuario en un navegador después de que se haya otorgado el consentimiento inicial.

    Para implementar este flujo, necesitarás:

    1. Obtener las credenciales del cliente desde la Consola de Google Cloud. Estas son las mismas credenciales que usarías para la guía de inicio rápido.
    2. Usar las bibliotecas google-auth y google-auth-oauthlib para obtener un token de autorización.
    3. Usar el token de autorización para realizar solicitudes a las API de Gmail y Calendar.

    Aquí tienes un ejemplo de código que muestra cómo obtener un token de autorización:

    from google.oauth2.credentials import Credentials
    from google_auth_oauthlib.flow import InstalledAppFlow
    
    SCOPES = [
        'https://www.googleapis.com/auth/calendar',
        'https://www.googleapis.com/auth/gmail.readonly',
        'https://mail.google.com/'
    ]
    
    flow = InstalledAppFlow.from_client_secrets_file(
        'ruta/a/client_secret.json', SCOPES)
    
    credentials = flow.run_local_server(port=0)
    
    # Guarda las credenciales para usarlas en solicitudes posteriores
    creds = Credentials.from_authorized_user_info(credentials.to_json())
    

    Este código abrirá una ventana del navegador donde el usuario puede otorgar consentimiento a tu aplicación. Una vez que se otorga el consentimiento, el token de autorización se devolverá a tu código y se podrá usar para realizar solicitudes a la API. Ten en cuenta que el método run_local_server inicia un servidor web local para escuchar la respuesta de autorización y luego se apaga automáticamente una vez que se recibe la respuesta.

    En general, el flujo de OAuth de tres patas es una forma más segura y confiable de obtener el consentimiento del usuario, incluso en un entorno sin interfaz gráfica. Si bien puede requerir un poco más de configuración y complejidad de código, elimina la necesidad de interacción con el navegador y sirve como una solución más sólida.

Comments are closed.