¿Por qué me aparece el error 403 al utilizar el sdk de Microsoft Graph con Python?

Ángel Gabriel Larios Acosta 0 Puntos de reputación
2024-11-25T18:11:09.5366667+00:00

Estoy utilizando el SDK de Python de Microsoft Graph para consumir la API y crear una reunión en Microsoft Teams. Sin embargo, al intentar realizar esta operación, me encuentro con un error 403 Forbidden, y no tengo claro el motivo. Ya he configurado los permisos necesarios para mi aplicación en Azure Active Directory. En particular, he agregado los permisos OnlineMeetings.ReadWrite tanto en permisos de aplicación como en permisos delegados. A pesar de esto, sigo recibiendo el error 403 al intentar crear la reunió

import asyncio
from azure.identity.aio import ClientSecretCredential
from azure.identity import DeviceCodeCredential
from azure.identity import AuthorizationCodeCredential
from msgraph import GraphServiceClient
from datetime import datetime
from msgraph.generated.models.online_meeting import OnlineMeeting
from msgraph.generated.users.item.online_meetings.online_meetings_request_builder import OnlineMeetingsRequestBuilder
from kiota_abstractions.base_request_configuration import RequestConfiguration
import os
from zoneinfo import ZoneInfo
async def get_online_meetings():
    # Configuración de autenticación
    tenant_id = os.getenv('TENANT_ID')
    client_id = os.getenv('TEAMS_CLIENT_ID')
    client_secret = os.getenv("TEAMS_CLIENT_SECRET")
    scopes = ['https://graph.microsoft.com/.default']

    try:
        # Autenticación usando DeviceCodeCredential
        credential = DeviceCodeCredential(
            tenant_id=tenant_id,
            client_id=client_id,
            client_secret=client_secret
        )
        
        # Inicializar el cliente de Microsoft Graph
        graph_client = GraphServiceClient(credentials=credential, scopes=scopes)
        
        # Obtener información del usuario autenticado
        user = await graph_client.me.get()
        print(f"Autenticado como: {user.display_name}")

        

        # Buscar la reunión
        #result = await graph_client.me.online_meetings.get(request_configuration=request_configuration)

        
        # user = await graph_client.users.by_user_id('userPrincipalName').get()
        # if user:
        #     print(user.display_name)

        cst_zone = ZoneInfo("America/Mexico_City")
        start_time = datetime(2024, 11, 19, 14, 30, tzinfo=cst_zone)  # Ejemplo: 19 de noviembre a las 14:30
        end_time = start_time.replace(hour=15, minute=0)  # Duración de 30

        request_body = OnlineMeeting(
            start_date_time="2024-11-19T16:00:00.0000000-07:00",
            end_date_time="2024-11-19T16:30:00.0000000-07:00",
            subject="User Token Meeting",
        )
        
        # Realizar la solicitud para crear la reunión
        result = await graph_client.me.online_meetings.post(request_body)
        
        # # Mostrar el resultado de la creación de la reunión
        # print(f"Reunión creada con éxito. Join URL: {result.join_web_url}")

    except Exception as e:
        print(f"Error al autenticarse o al obtener las reuniones: {e}")

# Ejecutar la función
asyncio.run(get_online_meetings())


El error que me devuelve este

Imagen del usuario

Estos son los permisos de app de microsoft entra id

Imagen del usuario

Azure
Azure
Plataforma e infraestructura de informática en la nube para crear, implementar y administrar aplicaciones y servicios a través de una red mundial de centros de datos administrados por Microsoft.
571 preguntas
0 comentarios No hay comentarios
{count} votos

1 respuesta

Ordenar por: Muy útil
  1. Gao Chen 9,665 Puntos de reputación Personal externo de Microsoft
    2024-11-25T22:27:43.6966667+00:00

    Hola Ángel Gabriel Larios Acosta,

    ¡Bienvenido(a) a Microsoft Q&A!

    Por favor ten en cuenta que nosotros no soportamos códigos ni scripts, sin embargo, aca hay algunas cosas que podrías verificar:

    1. Verifica que los permisos que has configurado (tanto en permisos de aplicación como en permisos delegados) hayan sido consentidos por un administrador. A veces, aunque los permisos estén configurados, el consentimiento del administrador es necesario para que la aplicación pueda utilizarlos.
    2. Verifica que el token de acceso que estás utilizando tenga los permisos correctos. Puedes decodificar el token usando jwt.ms para asegurarte de que incluya los permisos OnlineMeetings.ReadWrite
    3. Revisa la configuración de tu aplicación en Azure Active Directory. Asegúrate de que no haya restricciones adicionales que puedan estar bloqueando la operación.
    4. Asegúrate de que estás utilizando el endpoint correcto para crear reuniones. La URL debe ser algo como https://graph.microsoft.com/v1.0/me/onlineMeetings o https://graph.microsoft.com/v1.0/users/{user-id}/onlineMeetings, dependiendo de cómo estés intentando crear la reunión.
    5. Asegúrate de que las fechas y horas en request_body estén en el formato correcto y en la zona horaria adecuada. En tu código, estás usando start_date_time y end_date_time en formato UTC. Asegúrate de que estos valores sean correctos y que correspondan a la hora local que deseas.
         request_body = OnlineMeeting(
             start_date_time=start_time.isoformat(),  # Usa la variable start_time
             end_date_time=end_time.isoformat(),      # Usa la variable end_time
             subject="User Token Meeting",
         )
      
    6. El bloque except captura cualquier excepción, pero sería útil imprimir el mensaje de error completo para obtener más detalles sobre el problema. Puedes hacer esto así:
         except Exception as e:
             print(f"Error al autenticarse o al crear la reunión: {e}")
      

    Si el problema persiste, considera probar con ClientSecretCredential o AuthorizationCodeCredential para ver si el problema está relacionado con el método de autenticación que estás utilizando. Espero que información brindada fuera útil, si necesitas más asistencia, estoy a tu disposición.

    Atentamente,

    Gao


    Si esta respuesta resolvió tu consulta, por favor haz clic en 'Aceptar respuesta'. Esto nos ayuda a mejorar continuamente la calidad y relevancia de nuestras soluciones.


Su respuesta

Las respuestas se pueden marcar como respuestas aceptadas por el autor de la pregunta, lo que ayuda a los usuarios a conocer la respuesta que resolvió el problema del autor.