PHP 中 Microsoft Graph API 创建或更新事件错误:为何只有受邀用户可执行?
2024-03-24 10:14:46
# PHP 中使用 Microsoft Graph API 创建或更新事件时的错误:只有受邀用户还是有其他方法?
问题概览
使用 PHP 的 Microsoft Graph API 时,在创建或更新 Outlook 日历事件时遇到错误,提示只有受邀用户才能执行此操作。本文将探讨造成此问题的潜在原因,并提供解决方法和其他替代方案。
错误根源
权限问题: 确保已为您的应用程序授予 Calendars.ReadWrite 权限,以允许它创建和更新日历事件。
受众问题: 检查您使用的是具有对目标日历事件的访问权限的用户帐户,因为 Microsoft Graph API 需要指定受众来代表其执行操作。
日历权限问题: 除了 Graph API 权限,您的应用程序还需要对您要操作的日历具有适当的权限。使用 Calendar.ReadWrite 权限授予您的应用程序对该日历的访问权限。
API 端点问题: 对于创建事件,请使用 /me/events
端点;对于更新事件,请使用 /me/events/{eventId}
端点。
解决方案
1. 检查权限: 确保您已为您的应用程序授予必要的 Graph API 权限和受众权限。
2. 使用正确的 API 端点: 使用适当的 API 端点进行创建或更新事件操作。
3. 使用服务主体: 服务主体是 Microsoft Graph API 中的非交互式身份,无需用户授权即可执行操作,可以使用服务主体创建或更新事件。
4. 使用委托权限: 委托权限允许您的应用程序代表用户执行操作,无需提示用户授权。可以使用委托权限授予您的应用程序对用户日历的访问权限。
示例代码
以下是用 PHP 创建日历事件的示例代码,其中包括必要的权限设置和 API 端点:
use Microsoft\Graph\Graph;
use Microsoft\Graph\Model\Event;
use Microsoft\Graph\Model\Permission;
$graph = new Graph();
$graph->setAccessToken($accessToken);
$event = new Event();
$event->setSubject('Test Event');
$event->setBody(array('contentType' => 'text', 'content' => 'This is a test event'));
$event->setStart(array('dateTime' => '2023-03-08T10:00:00Z', 'timeZone' => 'UTC'));
$event->setEnd(array('dateTime' => '2023-03-08T11:00:00Z', 'timeZone' => 'UTC'));
$event = $graph->createRequest('POST', '/me/events')
->addHeaders(array('Content-Type' => 'application/json'))
->attachBody($event)
->execute();
echo "Event created: " . $event->getId();
常见问题解答
1. 为什么我仍然无法创建或更新事件?
- 检查您是否已授予应用程序所有必需的权限和使用正确的 API 端点。
- 考虑使用服务主体或委托权限。
2. 如何授予应用程序对我的日历的访问权限?
- 在 Microsoft Graph API 管理中心中,导航到 "应用",然后选择您的应用程序。
- 在 "权限" 选项卡中,添加 "Calendars.ReadWrite" 权限。
3. 如何获取服务主体?
- 沿用此链接创建一个 Azure Active Directory 应用程序,https://docs.microsoft.com/zh-cn/azure/active-directory/develop/quickstart-create-app-portal
- 将应用程序注册为服务主体,https://docs.microsoft.com/zh-cn/azure/active-directory/develop/howto-convert-app-to-service-principal
4. 如何使用委托权限?
- 授予您的应用程序对 Microsoft Graph API 的 "委托权限",https://docs.microsoft.com/zh-cn/graph/auth-v2-user
- 然后使用以下代码片段获取对日历的委托访问权限:
$graph->setAccessToken($accessToken);
$permissions = $graph->createRequest('GET', '/me/calendars/' . $calendarId . '/permissions')
->execute();
$permission = new Permission();
$permission->setRoles(array('Owner'));
$permission->setGrantTo(array('clientId' => $clientId));
$permission = $graph->createRequest('POST', '/me/calendars/' . $calendarId . '/permissions')
->addHeaders(array('Content-Type' => 'application/json'))
->attachBody($permission)
->execute();
5. 如何使用 Microsoft Graph Explorer?
- 使用 Microsoft Graph Explorer 来测试和调试您的 Graph API 请求,https://developer.microsoft.com/zh-cn/graph/graph-explorer
- 在 "请求" 选项卡中,选择您的请求类型并输入必要的详细信息。
- 在 "授权" 选项卡中,使用有效的访问令牌授权请求。