como puedo leer mi buzon de correo con graph

Carlos Rodríguez Proyectos Linktech 20 Puntos de reputación
2024-11-20T14:59:42.5966667+00:00

necesito acceder a mis correos atraves de graph, lo estoy haciendo con laravel php, obtengo el token y todo. y ya le di los permisos necesarios
{"error":{"code":"ErrorAccessDenied","message":"Access is denied. Check credentials and try again."}}

$client = new Client();
        
        try {
            $response = $client->post($authority.'/oauth2/v2.0/token', [
                'form_params' => [
                    'client_id' => $client_id,
                    'client_secret' => $client_secret,
                    'grant_type' => 'client_credentials',
                    'scope' => 'https://graph.microsoft.com/.default'
                ]
            ]);

            return json_decode($response->getBody(), true)['access_token'];
        } catch (\Exception $e) {
            $this->error('Error obteniendo el token de acceso: ' . $e->getMessage());
            return null;
        }
$accessToken = $this->getAccessToken();
        
        if (!$accessToken) {
            $this->error('No se pudo obtener el token de acceso.');
            return;
        }
        $client = new Client([
            'base_uri' => 'https://graph.microsoft.com/v1.0/',
            'headers' => [
                'Authorization' => "Bearer $accessToken",
                'Content-Type' => 'application/json',
            ],
        ]);
        
        // Obtener correos no leídos en el Inbox
        $response = $client->get("users/$sharedMailbox/mailFolders/Inbox/messages", [
            'query' => [
                '$filter' => "isRead eq false",
                '$top'    => 10,
                '$select' => 'id,subject,from,hasAttachments',
            ],
        ]);
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.
597 preguntas
0 comentarios No hay comentarios
{count} votos

Respuesta aceptada
  1. Jonathan Pereira Castillo 17,170 Puntos de reputación Personal externo de Microsoft Moderador
    2024-11-20T17:51:10.3633333+00:00

    ¡Hola Carlos Rodríguez Proyectos Linktech!

    Bienvenido a Microsoft Q&A.

    Parece que estás muy cerca de lograrlo. El error "Access is denied" generalmente indica que los permisos necesarios no están configurados correctamente o que el token de acceso no tiene los permisos adecuados. Aquí hay algunos pasos que puedes seguir para solucionar este problema:

    1. Verificar Permisos:
      • Asegúrate de que la aplicación registrada en Azure AD tenga los permisos necesarios para acceder al correo. Los permisos comunes incluyen Mail.Read, Mail.ReadWrite, Mail.Send, etc. Puedes verificar y agregar estos permisos en el portal de Azure bajo "API permissions".
    2. Conceder Consentimiento Administrativo:
      • Después de agregar los permisos, asegúrate de conceder el consentimiento administrativo para que los permisos sean efectivos. Esto se puede hacer en el portal de Azure o mediante un enlace de consentimiento.
    3. Usar el Endpoint Correcto:
      • Asegúrate de que estás usando el endpoint correcto para obtener el token de acceso. Para la autenticación de cliente, el endpoint debe ser https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token.
    4. Verificar el Scope:
      • El scope en tu solicitud de token debe incluir https://graph.microsoft.com/.default para asegurarte de que todos los permisos configurados en Azure AD sean incluidos en el token.

    Usar la API de REST de Correo de Outlook

    Información general sobre la API de correo de Outlook

    Aquí tienes un ejemplo de cómo debería verse tu código PHP para obtener el token y acceder a los correos:

    $client = new Client();
    try {
        $response = $client->post('https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token', [
            'form_params' => [
                'client_id' => $client_id,
                'client_secret' => $client_secret,
                'grant_type' => 'client_credentials',
                'scope' => 'https://graph.microsoft.com/.default'
            ]
        ]);
        $accessToken = json_decode($response->getBody(), true)['access_token'];
    } catch (\Exception $e) {
        echo 'Error obteniendo el token de acceso: ' . $e->getMessage();
        return;
    }
    $client = new Client([
        'base_uri' => 'https://graph.microsoft.com/v1.0/',
        'headers' => [
            'Authorization' => "Bearer $accessToken",
            'Content-Type' => 'application/json',
        ],
    ]);
    $response = $client->get("users/$sharedMailbox/mailFolders/Inbox/messages", [
        'query' => [
            '$filter' => "isRead eq false",
            '$top'    => 10,
            '$select' => 'id,subject,from,hasAttachments',
        ],
    ]);
    $messages = json_decode($response->getBody(), true);
    print_r($messages);
    

    Espero que estos consejos ayuden a resolver el problema. Si necesitas más asistencia, estoy a tu disposición.

    Saludos,

    Jonathan.

    ----------*

    Tu opinión es muy importante para nosotros! Si esta respuesta resolvió tu consulta, por favor haz clic en ''. Esto nos ayuda a mejorar continuamente la calidad y relevancia de nuestras soluciones.

    0 comentarios No hay comentarios

2 respuestas adicionales

Ordenar por: Muy útil
  1. Carlos Solís Salazar 18,276 Puntos de reputación MVP Moderador voluntario
    2024-11-20T15:26:31.4666667+00:00

    Asegúrate de que el App Registration tenga los permisos correctos en Entra ID. Necesitas permisos como Mail.Read o Mail.ReadWrite

    0 comentarios No hay comentarios

  2. Jonathan Pereira Castillo 17,170 Puntos de reputación Personal externo de Microsoft Moderador
    2024-11-21T21:00:41.1033333+00:00

    Hola Carlos Rodríguez Proyectos Linktech!

    Agradezco sinceramente por haber tenido la oportunidad de ayudarle Es gratificante saber que la información que proporcioné estaba correcta

    Jonathan

    0 comentarios No hay comentarios

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.