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

Laravel集成Microsoft Graph:单一授权流无法混用Graph与Exchange权限

解决Laravel中同时获取Microsoft Graph与Exchange Online权限令牌的问题

问题根源

你添加的Exchange.ManageAsApp是应用权限(应用级权限),而原配置中的大部分权限(如User.Read.All、Directory.Read.All)属于委托权限(用户委托权限)。这两类权限对应的OAuth2授权流完全不同:

  • 委托权限依赖授权码流,需要用户登录授权,代表用户执行操作;
  • 应用权限依赖客户端凭证流,不需要用户登录,直接以应用身份执行操作。

将两种权限混在同一个授权请求中,会导致授权流程冲突,出现登录循环或失败的情况。

解决方案:双令牌分离机制

需要分别获取两类权限对应的令牌,各自用于对应的API操作:

1. 配置Azure AD应用权限

  • 登录Azure AD门户,找到你的多租户应用;
  • 进入「API权限」页面,添加Exchange.ManageAsApp权限(注意选择「应用权限」类型,而非「委托权限」);
  • 点击「授予管理员同意」(多租户场景下,目标租户的管理员也需要为该应用授予此同意)。

2. 保留原授权码流处理Graph委托权限

原有的laravel-microsoft-graph包配置无需改动(移除Exchange.ManageAsApp),继续用授权码流获取用户委托的Graph令牌,处理用户相关的Graph操作。

3. 单独实现客户端凭证流获取Exchange应用令牌

在Laravel中新增方法,通过客户端凭证流获取应用级令牌,用于Exchange Online操作:

use Illuminate\Support\Facades\Http;

function getExchangeAppToken() {
    $tenantId = env('MSGRAPH_TENANT_ID');
    $clientId = env('MSGRAPH_CLIENT_ID');
    $clientSecret = env('MSGRAPH_SECRET_ID');

    $response = Http::asForm()->post(
        "https://login.microsoftonline.com/{$tenantId}/oauth2/v2.0/token",
        [
            'grant_type' => 'client_credentials',
            'client_id' => $clientId,
            'client_secret' => $clientSecret,
            'scope' => 'https://outlook.office365.com/.default' // Exchange应用权限的固定scope
        ]
    );

    return $response->json();
}

4. 分别使用令牌

  • 对于Microsoft Graph的用户委托操作,继续使用原包提供的令牌;
  • 对于Exchange Online的应用级操作,使用上述方法获取的令牌,调用Exchange API或Graph中与Exchange相关的应用权限接口。

关键注意事项

  • 应用权限需要租户管理员明确同意,多租户场景下,每个目标租户的管理员都需要完成同意操作;
  • 客户端凭证流获取的令牌有效期为1小时,建议实现缓存机制,避免频繁请求令牌;
  • Exchange应用权限的scope必须指定为https://outlook.office365.com/.default,不能单独指定Exchange.ManageAsApp。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:53:14