Implementación del API Microsoft Graph - sar-05/PIA_HIBP GitHub Wiki
Descripción
Esta API publicada por Microsoft permite almacenar, recuperar y modificar datos almacenados en los servicios en la nube proveídos por la compañía como Copilot 365 o Microsoft Entra. La documentación oficial se encuentra en el siguiente enlace
Justificación
Para recopilar las respuesta de nuestro demográfico utilizaremos el servicio de Microsoft Forms gracias a su facilidad de uso, integración con los servicios escolares de la UANL y por su capacidad para exportar los resultados a una hoja de cálculo de excel; formato que se ajusta de manera adecuada al volumen de datos a analizar. Esta hoja de cálculo se almacena en la cuenta de One Drive del creador del Forms, lo cual permite que sea consultada a través de una solicitud GET desde un script local.
Autenticación y Verificación
Para evitar el manejo de datos sensibles de manera manual, la hoja de cálculo jamás deja la nube de Microsoft, y el proceso de extracción de datos sigue los métodos de autenticación e identificación que provee la librería msal diseñada por Microsoft específicamente para este propósito.
El flujo de autenticación es el siguiente:
- La aplicación (en esta caso, data_request.py) debe registrarse a través de la plataforma de identidad de Microsoft (Microsoft Azure).
- Se inicia el flujo OAUTH solicitando un token de autorización,
- El usuario recibe el token después de ingresar a su cuenta via sus credenciales y verificar el código generado por el script
- Finalmente, se realiza la solicitud GET deseada utilizando el token.
Generación del Token de Autenticación
Para facilitar el mantenimiento del código, se optó por crear el módulo ms_graph, donde se define la función ms_graph_token, que genera dicho token vía el flujo de autenticación de dispositivo. De este modo se importan de msal únicamente las funciones necesarias: PublicClientApplication y authority.
Parámetros de la función ms_graph_token
- app_id: El id de la aplicación autorizada vía Microsoft Azure.
- authority_url: El URL de la autoridad que es host del servicio (comúnmente, el mismo Microsoft)
- az_scopes: Los permisos que la aplicación tiene sobre la cuenta conectada. Para nuestra app, se necesitan los permisos:
- User.Read para acceder a los datos generales del usuario que guarda la hoja de cálculo,
- "Files.Read" para poder leer y acceder a los archivos en la cuenta.
- "Files.ReadWrite" que extiende el alcance del permiso anterior para que también pueda realizar modificaciones en los archivos.
Creación del Cliente
La función crea un objeto llamado client_obj, el cual contiene por propiedades el app_id y el authority_url. Usando el método initiate_device_flow sobre client_obj (que recibe los permisos de scope), se define el diccionario flow, que contiene el código de usuario necesario para generar el token y el enlace de ingreso a la cuenta, el cual se imprime. Usando el módulo webbrowser, se abre una ventana al enlace en donde el usuario debe ingresar las credenciales de la cuenta de Microsoft y el código de usuario. Usando el método acquire_token_by_device_flow obtenemos un segundo diccionario con el token, el cual retornamos usando la llave ‘token’
Solicitud de datos
Finalmente, usando el módulo request, se pasan el diccionario headers (que contiene el token) y la variable endpoint (que contiene el URL base del API de Microsoft Graph y la subdirección para acceder al archivo) para solicitar un rango de datos de la hoja de cálculo. Dicho rango es devuelto en formato JSON, y almacenado en la variable data.