使用 Microsoft Graph 生成 PHP 应用
本教程介绍如何生成使用 Microsoft Graph API 代表用户访问数据的 PHP 控制台应用。
备注
若要了解如何使用 Microsoft Graph 通过仅限应用的身份验证访问数据,请参阅此 仅限应用的身份验证教程。
在本教程中,你将:
- 获取已登录用户
- 列出用户的收件箱邮件
- "发送电子邮件"
提示
作为本教程的替代方法,可以通过 快速启动 工具下载完成的代码,该工具可自动执行应用注册和配置。 下载的代码无需进行任何修改即可正常工作。
还可以下载或克隆 GitHub 存储库 ,并按照 README 中的说明注册应用程序并配置项目。
先决条件
在开始本教程之前,应在开发计算机上安装 PHP 和 Composer 。
还应该有一个包含 Exchange Online 邮箱Microsoft工作或学校帐户。 如果没有 Microsoft 365 租户,则可以通过 Microsoft 365 开发人员计划获得租户;有关详细信息,请参阅 常见问题解答。 或者,可以 注册 1 个月的免费试用版或购买 Microsoft 365 计划。
备注
本教程使用 PHP 版本 8.1.5 和 Composer 版本 2.3.5 编写。 本指南中的步骤可能适用于其他版本,但尚未测试。
在门户中注册该应用
在本练习中,你将在 Azure Active Directory 中注册一个新应用程序以启用 用户身份验证。 可以使用 Microsoft Entra 管理中心或使用 Microsoft Graph PowerShell SDK 注册应用程序。
注册应用程序进行用户身份验证
在本部分中,你将注册一个支持使用 设备代码流进行用户身份验证的应用程序。
打开浏览器,导航到 Microsoft Entra 管理中心 ,并使用全局管理员帐户登录。
在左侧导航栏中选择“Microsoft Entra ID”,依次展开“标识”、“应用程序”和“应用注册”。
选择“新注册”。 输入应用程序的名称,例如
Graph User Auth Tutorial
。根据需要设置 支持的帐户类型 。 选项包括:
选项 谁可以登录? 仅限此组织目录中的帐户 仅限 Microsoft 365 组织中的用户 任何组织目录中的帐户 任何Microsoft 365 组织中的用户 (工作或学校帐户) 任何组织目录中的帐户...和个人Microsoft帐户 任何Microsoft 365 组织中的用户 (工作或学校帐户) 和个人Microsoft帐户 保留“重定向 URI”为空。
选择“注册”。 在应用程序的 “概述 ”页上,复制 “应用程序 (客户端) ID ”的值并保存它,下一步将需要它。 如果 为此组织目录中的“帐户”选择“仅 支持 帐户类型”,则还要复制 “目录 (租户) ID 并保存它。
选择“管理”下的“身份验证”。 找到 “高级设置” 部分,将 “允许公共客户端流” 切换开关更改为 “是”,然后选择“ 保存”。
备注
请注意,你未对应用注册配置任何 Microsoft Graph 权限。 这是因为此示例使用 动态同意 请求用户身份验证的特定权限。
创建 PHP 控制台应用
首先初始化新的 Composer 项目。 在要在其中创建项目的目录中打开命令行界面 (CLI) 。 运行以下命令:
composer init
回答提示。 对于大多数问题,可以接受默认值,但请回答 n
以下事项:
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\Graphtutorial" to the entered relative path. [src/, n to skip]: n
安装依赖项
在继续操作之前,请添加稍后将使用的一些其他依赖项。
- Microsoft Graph SDK for PHP 调用 Microsoft Graph。
- 用于从 .env 文件读取环境变量的 vlucas/phpdotenv。
在 CLI 中运行以下命令以安装依赖项。
composer require microsoft/microsoft-graph vlucas/phpdotenv
加载应用程序设置
在本部分中,你将向项目添加应用注册的详细信息。
在名为 .env 的项目的根目录中创建一个文件,并添加以下代码。
CLIENT_ID=YOUR_CLIENT_ID_HERE TENANT_ID=common GRAPH_USER_SCOPES='user.read mail.read mail.send'
根据下表更新值。
设置 值 CLIENT_ID
应用注册的客户端 ID TENANT_ID
如果选择了仅允许组织中的用户登录的选项,请将此值更改为租户 ID。 否则保留为 common
。重要
如果使用 git 等源代码管理,则现在是从源代码管理中排除 .env 文件以避免无意中泄露应用 ID 的好时机。
设计应用
在本部分中,你将创建一个基于控制台的简单菜单。
在项目的根目录中创建一个名为 main.php 的文件。 添加开始和结束 PHP 标记。
<?php ?>
在 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', 'TENANT_ID', 'GRAPH_USER_SCOPES']); initializeGraph(); greetUser(); $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 my inbox'.PHP_EOL); echo('3. Send mail'.PHP_EOL); echo('4. Make a Graph call'.PHP_EOL); $choice = (int)readline(''); switch ($choice) { case 1: displayAccessToken(); break; case 2: listInbox(); break; case 3: sendMail(); break; case 4: makeGraphCall(); break; case 0: default: print('Goodbye...'.PHP_EOL); } }
在文件末尾的结束 PHP 标记之前添加以下占位符方法。 你将在后面的步骤中实现它们。
function initializeGraph(): void { // TODO } function greetUser(): void { // TODO } function displayAccessToken(): void { // TODO } function listInbox(): void { // TODO } function sendMail(): void { // TODO } function makeGraphCall(): void { // TODO }
这将实现基本菜单,并从命令行读取用户的选择。
添加用户身份验证
在本部分中,将扩展上一练习中的应用程序,以支持使用 Azure AD 进行身份验证。 这是获取调用 Microsoft Graph 所需的 OAuth 访问令牌所必需的。
创建访问令牌提供程序
Microsoft Graph SDK 包括基于 PHP 联盟 OAuth2 客户端的身份验证提供程序。 但是,对于本教程,你将使用 设备代码流 来获取访问令牌。 包含的身份验证提供程序不实现此流,因此你将实现自定义访问令牌提供程序。
在项目的根目录中创建一个名为 DeviceCodeTokenProvider.php 的新文件。 添加以下代码。
<?php // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. use GuzzleHttp\Client; use Http\Promise\FulfilledPromise; use Http\Promise\Promise; use Http\Promise\RejectedPromise; use Microsoft\Kiota\Abstractions\Authentication\AccessTokenProvider; use Microsoft\Kiota\Abstractions\Authentication\AllowedHostsValidator; class DeviceCodeTokenProvider implements AccessTokenProvider { private string $clientId; private string $tenantId; private string $scopes; private AllowedHostsValidator $allowedHostsValidator; private string $accessToken; private Client $tokenClient; public function __construct(string $clientId, string $tenantId, string $scopes) { $this->clientId = $clientId; $this->tenantId = $tenantId; $this->scopes = $scopes; $this->allowedHostsValidator = new AllowedHostsValidator(); $this->allowedHostsValidator->setAllowedHosts([ "graph.microsoft.com", "graph.microsoft.us", "dod-graph.microsoft.us", "graph.microsoft.de", "microsoftgraph.chinacloudapi.cn" ]); $this->tokenClient = new Client(); } public function getAuthorizationTokenAsync(string $url, array $additionalAuthenticationContext = []): Promise { $parsedUrl = parse_url($url); $scheme = $parsedUrl["scheme"] ?? null; if ($scheme !== 'https' || !$this->getAllowedHostsValidator()->isUrlHostValid($url)) { return new FulfilledPromise(null); } // If we already have a user token, just return it // Tokens are valid for one hour, after that it needs to be refreshed if (isset($this->accessToken)) { return new FulfilledPromise($this->accessToken); } // https://learn.microsoft.com/azure/active-directory/develop/v2-oauth2-device-code $deviceCodeRequestUrl = 'https://login.microsoftonline.com/'.$this->tenantId.'/oauth2/v2.0/devicecode'; $tokenRequestUrl = 'https://login.microsoftonline.com/'.$this->tenantId.'/oauth2/v2.0/token'; // First POST to /devicecode $deviceCodeResponse = json_decode($this->tokenClient->post($deviceCodeRequestUrl, [ 'form_params' => [ 'client_id' => $this->clientId, 'scope' => $this->scopes ] ])->getBody()->getContents()); // Display the user prompt print($deviceCodeResponse->message.PHP_EOL); // Response also indicates how often to poll for completion // And gives a device code to send in the polling requests $interval = (int)$deviceCodeResponse->interval; $device_code = $deviceCodeResponse->device_code; // Do polling - if attempt times out the token endpoint // returns an error while (true) { sleep($interval); // POST to the /token endpoint $tokenResponse = $this->tokenClient->post($tokenRequestUrl, [ 'form_params' => [ 'client_id' => $this->clientId, 'grant_type' => 'urn:ietf:params:oauth:grant-type:device_code', 'device_code' => $device_code ], // These options are needed to enable getting // the response body from a 4xx response 'http_errors' => false, 'curl' => [ CURLOPT_FAILONERROR => false ] ]); if ($tokenResponse->getStatusCode() == 200) { // Return the access_token $responseBody = json_decode($tokenResponse->getBody()->getContents()); $this->accessToken = $responseBody->access_token; return new FulfilledPromise($responseBody->access_token); } else if ($tokenResponse->getStatusCode() == 400) { // Check the error in the response body $responseBody = json_decode($tokenResponse->getBody()->getContents()); if (isset($responseBody->error)) { $error = $responseBody->error; // authorization_pending means we should keep polling if (strcmp($error, 'authorization_pending') != 0) { return new RejectedPromise( new Exception('Token endpoint returned '.$error, 100)); } } } } } public function getAllowedHostsValidator(): AllowedHostsValidator { return $this->allowedHostsValidator; } } ?>
配置 Graph 客户端以用于用户身份验证
在本部分中, DeviceCodeTokenProvider
你将使用 类通过 设备代码流请求访问令牌。
在项目的根目录中创建一个名为 GraphHelper.php 的新文件。 添加以下代码。
<?php class GraphHelper { } ?>
在 PHP 标记中添加以下
using
语句。use Microsoft\Graph\Generated\Models; use Microsoft\Graph\Generated\Users\Item\MailFolders\Item\Messages\MessagesRequestBuilderGetQueryParameters; use Microsoft\Graph\Generated\Users\Item\MailFolders\Item\Messages\MessagesRequestBuilderGetRequestConfiguration; use Microsoft\Graph\Generated\Users\Item\SendMail\SendMailPostRequestBody; use Microsoft\Graph\Generated\Users\Item\UserItemRequestBuilderGetQueryParameters; use Microsoft\Graph\Generated\Users\Item\UserItemRequestBuilderGetRequestConfiguration; use Microsoft\Graph\GraphRequestAdapter; use Microsoft\Graph\GraphServiceClient; use Microsoft\Kiota\Abstractions\Authentication\BaseBearerTokenAuthenticationProvider; require_once 'DeviceCodeTokenProvider.php';
将以下代码添加到
GraphHelper
类。private static string $clientId = ''; private static string $tenantId = ''; private static string $graphUserScopes = ''; private static DeviceCodeTokenProvider $tokenProvider; private static GraphServiceClient $userClient; public static function initializeGraphForUserAuth(): void { GraphHelper::$clientId = $_ENV['CLIENT_ID']; GraphHelper::$tenantId = $_ENV['TENANT_ID']; GraphHelper::$graphUserScopes = $_ENV['GRAPH_USER_SCOPES']; GraphHelper::$tokenProvider = new DeviceCodeTokenProvider( GraphHelper::$clientId, GraphHelper::$tenantId, GraphHelper::$graphUserScopes); $authProvider = new BaseBearerTokenAuthenticationProvider(GraphHelper::$tokenProvider); $adapter = new GraphRequestAdapter($authProvider); GraphHelper::$userClient = GraphServiceClient::createWithRequestAdapter($adapter); }
将 main.php 中的空
initializeGraph
函数替换为以下内容。function initializeGraph(): void { GraphHelper::initializeGraphForUserAuth(); }
此代码从 .env 文件加载信息,并初始化两个 DeviceCodeTokenProvider
属性:对象和 GraphServiceClient
对象。 对象 DeviceCodeTokenProvider
将用于请求访问令牌,对象 GraphServiceClient
将用于调用 Microsoft Graph。
测试设备代码流
接下来,添加代码以从 GraphHelper
获取访问令牌。
将以下函数添加到
GraphHelper
类。public static function getUserToken(): string { return GraphHelper::$tokenProvider ->getAuthorizationTokenAsync('https://graph.microsoft.com')->wait(); }
将 main.php 中的空
displayAccessToken
函数替换为以下内容。function displayAccessToken(): void { try { $token = GraphHelper::getUserToken(); print('User token: '.$token.PHP_EOL.PHP_EOL); } catch (Exception $e) { print('Error getting access token: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
生成并运行应用。 当系统提示输入选项时,请输入
1
。 应用程序显示 URL 和设备代码。$ php main.php PHP Graph Tutorial Please choose one of the following options: 0. Exit 1. Display access token 2. List my inbox 3. Send mail 4. Make a Graph call 1 To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code RB2RUD56D to authenticate.
打开浏览器并浏览到显示的 URL。 输入提供的代码并登录。
重要
请注意浏览到
https://microsoft.com/devicelogin
时登录到浏览器的任何现有Microsoft 365 个帐户。 使用浏览器功能(如配置文件、来宾模式或专用模式)确保作为要用于测试的帐户进行身份验证。完成后,返回到应用程序以查看访问令牌。
提示
仅出于验证和调试目的,只能) 使用 Microsoft 的联机令牌分析程序在 中https://jwt.ms解码工作或学校帐户的用户访问令牌 (。 如果在调用 Microsoft Graph 时遇到令牌错误,这很有用。 例如,验证令牌中的声明是否
scp
包含预期的 Microsoft Graph 权限范围。
获取用户
在本部分中,你将将 Microsoft Graph 合并到应用程序中。 对于此应用程序,你将使用 Microsoft Graph SDK for PHP 调用 Microsoft Graph。
将以下代码添加到
GraphHelper
类。public static function getUser(): Models\User { $configuration = new UserItemRequestBuilderGetRequestConfiguration(); $configuration->queryParameters = new UserItemRequestBuilderGetQueryParameters(); $configuration->queryParameters->select = ['displayName','mail','userPrincipalName']; return GraphHelper::$userClient->me()->get($configuration)->wait(); }
将 main.php 中的空
greetUser
函数替换为以下内容。function greetUser(): void { try { $user = GraphHelper::getUser(); print('Hello, '.$user->getDisplayName().'!'.PHP_EOL); // For Work/school accounts, email is in Mail property // Personal accounts, email is in UserPrincipalName $email = $user->getMail(); if (empty($email)) { $email = $user->getUserPrincipalName(); } print('Email: '.$email.PHP_EOL.PHP_EOL); } catch (Exception $e) { print('Error getting user: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
如果立即运行应用,则登录后应用将按名称欢迎你。
Hello, Megan Bowen!
Email: MeganB@contoso.com
代码说明
请考虑 函数中的 getUser
代码。 这只是几行,但有一些关键细节需要注意。
访问“me”
函数生成对 获取用户 API 的请求。 可通过两种方式访问此 API:
GET /me
GET /users/{user-id}
在这种情况下,代码将调用 GET /me
API 终结点。 这是获取经过身份验证的用户而不了解其用户 ID 的快捷方式。
备注
GET /me
由于 API 终结点获取经过身份验证的用户,因此它仅适用于使用用户身份验证的应用。 仅限应用的身份验证应用无法访问此终结点。
请求特定属性
函数使用 $select 查询参数 来指定它所需的属性集。
强类型返回类型
函数从 API 的 JSON 响应返回 User
反序列化的对象。 由于代码使用 $select
,因此只有请求的属性在返回 User
的 对象中具有值。 所有其他属性将具有默认值。
列出收件箱
在本部分中,你将添加在用户的电子邮件收件箱中列出邮件的功能。
将以下代码添加到
GraphHelper
类。public static function getInbox(): Models\MessageCollectionResponse { $configuration = new MessagesRequestBuilderGetRequestConfiguration(); $configuration->queryParameters = new MessagesRequestBuilderGetQueryParameters(); // Only request specific properties $configuration->queryParameters->select = ['from','isRead','receivedDateTime','subject']; // Sort by received time, newest first $configuration->queryParameters->orderby = ['receivedDateTime DESC']; // Get at most 25 results $configuration->queryParameters->top = 25; return GraphHelper::$userClient->me() ->mailFolders() ->byMailFolderId('inbox') ->messages() ->get($configuration)->wait(); }
将 main.php 中的空
listInbox
函数替换为以下内容。function listInbox(): void { try { $messages = GraphHelper::getInbox(); // Output each message's details foreach ($messages->getValue() as $message) { print('Message: '.$message->getSubject().PHP_EOL); print(' From: '.$message->getFrom()->getEmailAddress()->getName().PHP_EOL); $status = $message->getIsRead() ? "Read" : "Unread"; print(' Status: '.$status.PHP_EOL); print(' Received: '.$message->getReceivedDateTime()->format(\DateTimeInterface::RFC2822).PHP_EOL); } $nextLink = $messages->getOdataNextLink(); $moreAvailable = isset($nextLink) && $nextLink != '' ? 'True' : 'False'; print(PHP_EOL.'More messages available? '.$moreAvailable.PHP_EOL.PHP_EOL); } catch (Exception $e) { print('Error getting user\'s inbox: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
运行应用,登录,然后选择选项 2 列出收件箱。
Please choose one of the following options: 0. Exit 1. Display access token 2. List my inbox 3. Send mail 4. Make a Graph call 2 Message: Updates from Ask HR and other communities From: Contoso Demo on Yammer Status: Read Received: Mon, 18 Apr 2022 14:24:16 +0000 Message: Employee Initiative Thoughts From: Patti Fernandez Status: Read Received: Mon, 18 Apr 2022 13:52:03 +0000 Message: Voice Mail (11 seconds) From: Alex Wilber Status: Unread Received: Wed, 13 Apr 2022 02:30:27 +0000 Message: Our Spring Blog Update From: Alex Wilber Status: Unread Received: Tue, 12 Apr 2022 16:46:01 +0000 Message: Atlanta Flight Reservation From: Alex Wilber Status: Unread Received: Mon, 11 Apr 2022 13:39:10 +0000 Message: Atlanta Trip Itinerary - down time From: Alex Wilber Status: Unread Received: Fri, 08 Apr 2022 18:36:01 +0000 ... More messages available? True
代码说明
请考虑 函数中的 getInbox
代码。
访问已知邮件文件夹
函数传递给 /me/mailFolders/inbox/messages
请求生成器,该生成器生成对 列表消息 API 的请求。 由于它包含 /mailFolders/inbox
段,API 将仅返回所请求邮件文件夹中的邮件。 在这种情况下,由于收件箱是用户邮箱中默认的已知文件夹,因此可通过其已知名称访问该文件夹。 非默认文件夹的访问方式相同,方法是将已知名称替换为邮件文件夹的 ID 属性。 有关可用已知文件夹名称的详细信息,请参阅 mailFolder 资源类型。
访问集合
与上一 getUser
部分中返回单个 对象的函数不同,此方法返回消息集合。 Microsoft Graph 中返回集合的大多数 API 不会在单个响应中返回所有可用结果。 相反,它们使用 分页 返回部分结果,同时为客户端提供请求下一个“页面”的方法。
默认页面大小
使用分页的 API 实现默认页面大小。 对于消息,默认值为 10。 客户端可以使用 $top 查询参数请求更多 (或更少的 ) 。 在 中 getInbox
,这是使用 queryParameters->top
查询参数中的 属性完成的。
备注
传入的值 queryParameters->top
是上限,而不是显式数字。 API 返回一些 消息,最多返回 指定值。
获取后续页面
如果服务器上有更多可用的结果,则集合响应将包含一个 @odata.nextLink
具有 API URL 的属性,用于访问下一页。 PHP SDK 将此公开为 getOdataNextLink
集合请求对象上的方法。 如果此方法返回非空字符串,则有更多可用的结果。 有关详细信息,请参阅 使用 Microsoft Graph SDK 对集合进行分页。
集合排序
函数使用 $orderby 查询参数 请求按消息接收时间排序的结果, receivedDateTime
(属性) 。 它包含 DESC
关键字,以便首先列出最近收到的消息。
发送邮件
在本部分中,你将添加以经过身份验证的用户身份发送电子邮件的功能。
将以下代码添加到
GraphHelper
类。public static function sendMail(string $subject, string $body, string $recipient): void { $message = new Models\Message(); $message->setSubject($subject); $itemBody = new Models\ItemBody(); $itemBody->setContent($body); $itemBody->setContentType(new Models\BodyType(Models\BodyType::TEXT)); $message->setBody($itemBody); $email = new Models\EmailAddress(); $email->setAddress($recipient); $to = new Models\Recipient(); $to->setEmailAddress($email); $message->setToRecipients([$to]); $sendMailBody = new SendMailPostRequestBody(); $sendMailBody->setMessage($message); GraphHelper::$userClient->me()->sendMail()->post($sendMailBody)->wait(); }
将 main.php 中的空
sendMail
函数替换为以下内容。function sendMail(): void { try { // Send mail to the signed-in user // Get the user for their email address $user = GraphHelper::getUser(); // For Work/school accounts, email is in Mail property // Personal accounts, email is in UserPrincipalName $email = $user->getMail(); if (empty($email)) { $email = $user->getUserPrincipalName(); } GraphHelper::sendMail('Testing Microsoft Graph', 'Hello world!', $email); print(PHP_EOL.'Mail sent.'.PHP_EOL.PHP_EOL); } catch (Exception $e) { print('Error sending mail: '.$e->getMessage().PHP_EOL.PHP_EOL); } }
运行应用,登录并选择选项 3 以向自己发送电子邮件。
Please choose one of the following options: 0. Exit 1. Display access token 2. List my inbox 3. Send mail 4. Make a Graph call 3 Mail sent.
备注
如果使用 Microsoft 365 开发人员计划中的开发人员租户进行测试,则发送的电子邮件可能未送达,并且可能会收到未送达报告。 如果发生这种情况,请通过 Microsoft 365 管理中心联系支持人员。
若要验证是否已收到邮件,请选择选项 2 列出收件箱。
代码说明
请考虑 函数中的 sendMail
代码。
发送邮件
函数使用 $userClient->me()->sendMail()
请求生成器,该生成器生成对 发送邮件 API 的请求。 请求生成器采用包含要发送的消息的请求正文。
创建对象
与以前调用 Microsoft Graph(仅读取数据)不同,此调用会创建数据。 若要使用客户端库执行此操作,请创建一个表示数据的关联数组,设置所需的属性,然后在 API 调用中发送它。 由于调用正在发送数据,因此使用 POST
方法而不是 GET
。
可选:添加自己的代码
在本部分中,将向应用程序添加自己的 Microsoft Graph 功能。 这可能是Microsoft Graph 文档 或 Graph 资源管理器中的代码片段,也可以是你创建的代码片段。 此部分是可选的。
更新应用
将以下代码添加到
GraphHelper
类。public static function makeGraphCall(): void { // INSERT YOUR CODE HERE }
将 main.php 中的空
makeGraphCall
函数替换为以下内容。function makeGraphCall(): void { try { GraphHelper::makeGraphCall(); } catch (Exception $e) { print(PHP_EOL.'Error making Graph call'.PHP_EOL.PHP_EOL); } }
选择 API
在 Microsoft Graph 中查找想要尝试的 API。 例如, 创建事件 API。 可以使用 API 文档中的示例之一,也可以创建自己的 API 请求。
配置权限
查看所选 API 的参考文档 的“权限” 部分,了解支持哪些身份验证方法。 例如,某些 API 不支持仅限应用或个人Microsoft帐户。
- 若要使用用户身份验证 (调用 API(如果 API 支持用户 (委托) 身份验证) ),请在 .env 中添加所需的权限范围。
- 若要使用仅应用身份验证调用 API,请参阅 仅限应用的身份验证 教程。
添加代码
将代码添加到 makeGraphCall
GraphHelper.php 中的 函数中。
恭喜!
已完成 PHP Microsoft Graph 教程。 现在,你已有一个可调用 Microsoft Graph 的工作应用,可以试验和添加新功能。
- 了解如何通过 Microsoft Graph PHP SDK 使用 仅限应用的身份验证 。
- 访问 Microsoft Graph 概述 ,查看可以使用 Microsoft Graph 访问的所有数据。
PHP 示例
你有关于此部分的问题? 如果有,请向我们提供反馈,以便我们对此部分作出改进。