You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Microsoft Graph PHP SDK访问日历事件时遇403权限拒绝问题

Microsoft Graph API访问日历事件403权限拒绝问题排查方案

问题概况

  • 已配置全量相关委托/应用权限:Calendars.Read(委托/应用)、Calendars.Read.Shared(委托)等
  • 沙箱用户均持有Microsoft 365 E5 Developer许可证与Exchange Online Plan 2
  • 客户端凭证流获取令牌后,访问/users/{id}/calendars可正常获取日历列表,但访问/users/{id}/events返回403;委托授权流下现象一致
  • 已移除「限制应用权限访问特定Exchange Online邮箱」策略,问题仍未解决

核心代码片段

$guzzle = new \GuzzleHttp\Client();
$url = 'https://login.microsoftonline.com/' . $tenantId . '/oauth2/v2.0/token';
$token = json_decode($guzzle->post($url, [
    'form_params' => [
        'client_id' => $clientId,
        'client_secret' => $clientSecret,
        'scope' => 'https://graph.microsoft.com/.default',
        'grant_type' => 'client_credentials',
    ],
])->getBody()->getContents());
$accessToken = $token->access_token;

$graph = new Graph();
$graph->setBaseUrl("https://graph.microsoft.com/")
    ->setAccessToken($accessToken);
$ptr = $graph->createCollectionRequest('GET', '/users/{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}/events')
    ->setPageSize(100);

访问令牌角色信息

"roles": [
    "Calendars.Read",
    "Mail.ReadBasic.All",
    "Group.Read.All",
    "User.Read.All",
    "Calendars.ReadBasic.All",
    "GroupMember.Read.All",
    "Calendars.ReadWrite",
    "Mail.Send"
]

排查与解决建议

  • 检查目标邮箱的日历权限:即使应用有全局权限,目标用户的日历可能设置了私有或仅限特定用户访问。需在Exchange管理中心,给应用对应的服务主体分配目标邮箱的Full Access权限,或直接在用户日历的共享设置中添加服务主体为可读取事件的对象
  • 确认应用权限生效状态:登录Azure AD门户,检查应用的Calendars.Read/Calendars.ReadWrite权限是否已被管理员明确同意,且没有被条件访问策略(如仅允许特定IP、设备访问)限制
  • 测试不同API版本:尝试切换到https://graph.microsoft.com/v1.0或https://graph.microsoft.com/beta端点测试,部分权限的生效范围在不同版本中存在差异
  • 验证用户邮箱状态:确认目标用户的Exchange Online邮箱已正常激活,没有处于禁用、归档或受限状态
  • 排查Exchange安全策略:检查是否存在Exchange Online的邮件流规则、应用访问控制策略,这类策略可能会拦截第三方应用对日历事件的读取请求

内容的提问来源于stack exchange,提问作者will900

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:05:36