Compilación de aplicaciones PHP con Microsoft Graph y autenticación solo de aplicaciones
En este tutorial se explica cómo crear una aplicación de consola PHP que use Microsoft Graph API para acceder a los datos mediante la autenticación de solo aplicación. La autenticación solo de aplicación es una buena opción para los servicios en segundo plano o las aplicaciones que necesitan acceder a los datos de todos los usuarios de una organización.
Nota:
Para obtener información sobre cómo usar Microsoft Graph para acceder a datos en nombre de un usuario, consulte este tutorial de autenticación de usuario (delegado).
En este tutorial, aprenderá a:
Sugerencia
Como alternativa a seguir este tutorial, puede descargar o clonar el repositorio de GitHub y seguir las instrucciones de README para registrar una aplicación y configurar el proyecto.
Requisitos previos
Antes de iniciar este tutorial, debe tener PHP y Composer instalados en la máquina de desarrollo.
También debe tener una cuenta profesional o educativa de Microsoft con el rol de administrador global. Si no tiene un inquilino de Microsoft 365, puede calificar para uno a través del Programa para desarrolladores de Microsoft 365; Para obtener más información, consulte las preguntas más frecuentes. Como alternativa, puede registrarse para obtener una evaluación gratuita de 1 mes o comprar un plan de Microsoft 365.
Nota:
Este tutorial se escribió con php versión 8.1.5 y Composer versión 2.3.5. Los pasos de esta guía pueden funcionar con otras versiones, pero no se han probado.
Registrar la aplicación en el portal
En este ejercicio registrará una nueva aplicación en Azure Active Directory para habilitar la autenticación de solo aplicación. Puede registrar una aplicación mediante el Centro de administración de Microsoft Entra o mediante el SDK de PowerShell de Microsoft Graph.
Registro de la aplicación para la autenticación de solo aplicación
En esta sección registrará una aplicación que admita la autenticación de solo aplicación mediante el flujo de credenciales de cliente.
Abra un explorador y vaya al Centro de administración de Microsoft Entra e inicie sesión con una cuenta de administrador global.
Seleccione Microsoft Entra ID en el panel de navegación izquierdo, expanda Identidad, aplicaciones y registros de aplicaciones.
Seleccione Nuevo registro. Escriba un nombre para la aplicación, por ejemplo,
Graph App-Only Auth Tutorial
.Establezca Tipos de cuenta admitidosen Solo cuentas en este directorio organizativo.
Deje URI de redireccionamiento vacía.
Seleccione Registrar. En la página Información general de la aplicación, copie el valor del identificador de aplicación (cliente) y del identificador de directorio (inquilino) y guárdelos, necesitará estos valores en el paso siguiente.
Seleccione Permisos de las API en Administrar.
Quite el permiso User.Read predeterminado en Permisos configurados ; para ello, seleccione los puntos suspensivos (...) de su fila y seleccione Quitar permiso.
Seleccione Agregar un permiso y, a continuación, Microsoft Graph.
Seleccione Permisos de aplicación.
Seleccione User.Read.All y, a continuación, seleccione Agregar permisos.
Seleccione Conceder consentimiento de administrador para...y, a continuación, seleccione Sí para proporcionar el consentimiento del administrador para el permiso seleccionado.
Seleccione Certificados y secretos en Administrar y, a continuación, seleccione Nuevo secreto de cliente.
Escriba una descripción, elija una duración y seleccione Agregar.
Copie el secreto de la columna Valor ; lo necesitará en los pasos siguientes.
Importante
El secreto de cliente no se vuelve a mostrar, así que asegúrese de copiarlo en este momento.
Nota:
Tenga en cuenta que, a diferencia de los pasos al registrarse para la autenticación de usuario, en esta sección configuró los permisos de Microsoft Graph en el registro de la aplicación. Esto se debe a que la autenticación de solo aplicación usa el flujo de credenciales de cliente, lo que requiere que los permisos se configuren en el registro de la aplicación. Consulte El ámbito .default para obtener más información.
Creación de una aplicación de consola PHP
Empiece por inicializar un nuevo proyecto de Composer. Abra la interfaz de línea de comandos (CLI) en un directorio donde quiera crear el proyecto. Ejecuta el siguiente comando.
composer init
Responda a las indicaciones. Puede aceptar los valores predeterminados para la mayoría de las preguntas, pero responder n
a lo siguiente:
Would you like to define your dependencies (require) interactively [yes]? n
Would you like to define your dev dependencies (require-dev) interactively [yes]? n
Add PSR-4 autoload mapping? Maps namespace "Microsoft\Graphapponlytutorial" to the entered relative path. [src/, n to skip]: n
Instalar dependencias
Antes de continuar, agregue algunas dependencias adicionales que usará más adelante.
- SDK de Microsoft Graph para PHP para realizar llamadas a Microsoft Graph.
- vlucas/phpdotenv para leer variables de entorno de archivos .env.
Ejecute el siguiente comando en la CLI para instalar las dependencias.
composer require microsoft/microsoft-graph vlucas/phpdotenv
Cargar la configuración de la aplicación
En esta sección agregará los detalles del registro de la aplicación al proyecto.
Cree un archivo en el directorio raíz del proyecto denominado .env y agregue el código siguiente.
CLIENT_ID=YOUR_CLIENT_ID_HERE CLIENT_SECRET=YOUR_CLIENT_SECRET_HERE_IF_USING_APP_ONLY TENANT_ID=YOUR_TENANT_ID_HERE_IF_USING_APP_ONLY
Actualice los valores según la tabla siguiente.
Configuración Valor CLIENT_ID
El identificador de cliente del registro de la aplicación CLIENT_SECRET
El secreto de cliente del registro de la aplicación TENANT_ID
El identificador de inquilino de la organización Importante
Si usa el control de código fuente como Git, ahora sería un buen momento para excluir el archivo .env del control de código fuente para evitar la pérdida accidental del identificador de aplicación.
Diseñar la aplicación
En esta sección creará un menú simple basado en consola.
Cree un archivo en el directorio raíz del proyecto denominado main.php. Agregue las etiquetas PHP de apertura y cierre.
<?php ?>
Agregue el código siguiente entre las etiquetas PHP.
// Enable loading of Composer dependencies require_once realpath(__DIR__ . '/vendor/autoload.php'); require_once 'GraphHelper.php'; print('PHP Graph Tutorial'.PHP_EOL.PHP_EOL); // Load .env file $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $dotenv->required(['CLIENT_ID', 'CLIENT_SECRET', 'TENANT_ID']); initializeGraph(); $choice = -1; while ($choice != 0) { echo('Please choose one of the following options:'.PHP_EOL); echo('0. Exit'.PHP_EOL); echo('1. Display access token'.PHP_EOL); echo('2. List users'.PHP_EOL); echo('3. Make a Graph call'.PHP_EOL); $choice = (int)readline(''); switch ($choice) { case 1: displayAccessToken(); break; case 2: listUsers(); break; case 3: makeGraphCall(); break; case 0: default: print('Goodbye...'.PHP_EOL); } }
Agregue los siguientes métodos de marcador de posición al final del archivo antes de cerrar la etiqueta PHP. Los implementará en pasos posteriores.
function initializeGraph(): void { // TODO } function displayAccessToken(): void { // TODO } function listUsers(): void { // TODO } function makeGraphCall(): void { // TODO }
Esto implementa un menú básico y lee la elección del usuario desde la línea de comandos.
Agregar autenticación de solo aplicación
En esta sección agregará la autenticación de solo aplicación a la aplicación. Esto es necesario para obtener el token de acceso de OAuth necesario para llamar a Microsoft Graph.
Configuración del cliente de Graph para la autenticación solo de la aplicación
En esta sección usará la PhpLeagueAuthenticationProvider
clase para solicitar un token de acceso mediante el flujo de credenciales de cliente.
Cree un nuevo archivo en el directorio raíz del proyecto denominado GraphHelper.php. Agregue el siguiente código.
<?php class GraphHelper { } ?>
Agregue las siguientes
using
instrucciones dentro de las etiquetas PHP.use Microsoft\Graph\Core\Authentication\GraphPhpLeagueAccessTokenProvider; use Microsoft\Graph\Generated\Models; use Microsoft\Graph\Generated\Users\UsersRequestBuilderGetQueryParameters; use Microsoft\Graph\Generated\Users\UsersRequestBuilderGetRequestConfiguration; use Microsoft\Graph\GraphServiceClient; use Microsoft\Kiota\Authentication\Oauth\ClientCredentialContext;
Agregue el código siguiente a la clase
GraphHelper
.private static string $clientId = ''; private static string $clientSecret = ''; private static string $tenantId = ''; private static ClientCredentialContext $tokenContext; private static GraphServiceClient $appClient; public static function initializeGraphForAppOnlyAuth(): void { GraphHelper::$clientId = $_ENV['CLIENT_ID']; GraphHelper::$clientSecret = $_ENV['CLIENT_SECRET']; GraphHelper::$tenantId = $_ENV['TENANT_ID']; GraphHelper::$tokenContext = new ClientCredentialContext( GraphHelper::$tenantId, GraphHelper::$clientId, GraphHelper::$clientSecret); GraphHelper::$appClient = new GraphServiceClient( GraphHelper::$tokenContext, ['https://graph.microsoft.com/.default']); }
Reemplace la función vacía
initializeGraph
en main.php por lo siguiente.function initializeGraph(): void { GraphHelper::initializeGraphForAppOnlyAuth(); }
Este código carga información del archivo .env e inicializa dos propiedades, un ClientCredentialContext
objeto y un GraphServiceClient
objeto . El ClientCredentialContext
objeto se usará para autenticar las solicitudes y el GraphServiceClient
objeto se usará para realizar llamadas a Microsoft Graph.
Prueba del flujo de credenciales de cliente
A continuación, agregue código para obtener un token de acceso de GraphHelper
.
Agregue la siguiente función a la clase
GraphHelper
.public static function getAppOnlyToken(): string { // Create an access token provider to get the token $tokenProvider = new GraphPhpLeagueAccessTokenProvider(GraphHelper::$tokenContext); return $tokenProvider ->getAuthorizationTokenAsync('https://graph.microsoft.com') ->wait(); }
Reemplace la función vacía
displayAccessToken
en main.php por lo siguiente.function displayAccessToken(): void { try { $token = GraphHelper::getAppOnlyToken(); print('App-only token: '.$token.PHP_EOL.PHP_EOL); } catch (Exception $e) { print('Error getting access token: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
Compile y ejecute la aplicación. Escriba
1
cuando se le solicite una opción. La aplicación muestra el token de acceso que ha capturado mediante la información de autenticación configurada anteriormente en las variables de entorno.$ php main.php PHP Graph Tutorial Please choose one of the following options: 0. Exit 1. Display access token 2. List users 3. Make a Graph call 1 App-only token: eyJ0eXAiOiJKV1QiLCJub25jZSI6IlVDTzRYOWtKYlNLVjVkRzJGenJqd2xvVUcwWS...
Sugerencia
Solo con fines de validación y depuración, puede descodificar tokens de acceso de solo aplicación mediante el analizador de tokens en línea de Microsoft en https://jwt.ms. Esto puede ser útil si encuentra errores de token al llamar a Microsoft Graph. Por ejemplo, comprobar que la
role
notificación del token contiene los ámbitos de permiso de Microsoft Graph esperados.
List users
En esta sección agregará la capacidad de enumerar todos los usuarios de Azure Active Directory mediante la autenticación de solo aplicación.
Agregue el código siguiente a la clase
GraphHelper
.public static function getUsers(): Models\UserCollectionResponse { $configuration = new UsersRequestBuilderGetRequestConfiguration(); $configuration->queryParameters = new UsersRequestBuilderGetQueryParameters(); // Only request specific properties $configuration->queryParameters->select = ['displayName','id','mail']; // Sort by display name $configuration->queryParameters->orderby = ['displayName']; // Get at most 25 results $configuration->queryParameters->top = 25; return GraphHelper::$appClient->users()->get($configuration)->wait(); }
Reemplace la función vacía
listUsers
en main.php por lo siguiente.function listUsers(): void { try { $users = GraphHelper::getUsers(); // Output each user's details foreach ($users->getValue() as $user) { print('User: '.$user->getDisplayName().PHP_EOL); print(' ID: '.$user->getId().PHP_EOL); $email = $user->getMail(); $email = isset($email) ? $email : 'NO EMAIL'; print(' Email: '.$email.PHP_EOL); } $nextLink = $users->getOdataNextLink(); $moreAvailable = isset($nextLink) && $nextLink != '' ? 'True' : 'False'; print(PHP_EOL.'More users available? '.$moreAvailable.PHP_EOL.PHP_EOL); } catch (Exception $e) { print(PHP_EOL.'Error getting users: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
Ejecute la aplicación, inicie sesión y elija la opción 2 para enumerar a los usuarios.
Please choose one of the following options: 0. Exit 1. Display access token 2. List users 3. Make a Graph call 2 User: Adele Vance ID: 05fb57bf-2653-4396-846d-2f210a91d9cf Email: AdeleV@contoso.com User: Alex Wilber ID: a36fe267-a437-4d24-b39e-7344774d606c Email: AlexW@contoso.com User: Allan Deyoung ID: 54cebbaa-2c56-47ec-b878-c8ff309746b0 Email: AllanD@contoso.com User: Bianca Pisani ID: 9a7dcbd0-72f0-48a9-a9fa-03cd46641d49 Email: NO EMAIL User: Brian Johnson (TAILSPIN) ID: a8989e40-be57-4c2e-bf0b-7cdc471e9cc4 Email: BrianJ@contoso.com ... More users available? true
Código explicado
Tenga en cuenta el código de la getUsers
función .
- Obtiene una colección de usuarios.
-
queryParameters->select
Usa para solicitar propiedades específicas -
queryParameters->top
Usa para limitar el número de usuarios devueltos -
queryParameters->orderby
Usa para ordenar la respuesta
Opcional: agregue su propio código
En esta sección agregará sus propias funcionalidades de Microsoft Graph a la aplicación. Podría tratarse de un fragmento de código de la documentación de Microsoft Graph o del Explorador de Graph, o código que haya creado. Esta sección es opcional.
Actualizar la aplicación
Agregue el código siguiente a la clase
GraphHelper
.public static function makeGraphCall(): void { // INSERT YOUR CODE HERE }
Reemplace la función vacía
makeGraphCall
en main.php por lo siguiente.function makeGraphCall(): void { try { GraphHelper::makeGraphCall(); } catch (Exception $e) { print(PHP_EOL.'Error making Graph call'.PHP_EOL.PHP_EOL); } }
Elección de una API
Busque una API en Microsoft Graph que le gustaría probar. Por ejemplo, create event API. Puede usar uno de los ejemplos de la documentación de la API o crear su propia solicitud de API.
Configurar permisos
Compruebe la sección Permisos de la documentación de referencia de la API elegida para ver qué métodos de autenticación se admiten. Algunas API no admiten solo aplicaciones ni cuentas personales de Microsoft, por ejemplo.
- Para llamar a una API con autenticación de usuario (si la API admite la autenticación de usuario (delegado), consulte el tutorial de autenticación de usuario (delegado ).
- Para llamar a una API con autenticación de solo aplicación (si la API la admite), agregue el ámbito de permisos necesario en el Centro de administración de Azure AD.
Agregar el código
Agregue el código a la makeGraphCall
función en GraphHelper.php.
¡Enhorabuena!
Ha completado el tutorial de Microsoft Graph de PHP. Ahora que tiene una aplicación en funcionamiento que llama a Microsoft Graph, puede experimentar y agregar nuevas características.
- Obtenga información sobre cómo usar la autenticación de usuario (delegado) con el SDK de PHP de Microsoft Graph.
- Visite información general de Microsoft Graph para ver todos los datos a los que puede acceder con Microsoft Graph.
Ejemplos de PHP
¿Tiene algún problema con esta sección? Si es así, envíenos sus comentarios para que podamos mejorarla.