You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何无需Outlook账号登录,通过PHP Curl获取Microsoft Graph API访问令牌

如何无需Outlook账号登录,通过PHP Curl获取Microsoft Graph API访问令牌

嘿,我来帮你搞定这个问题!你已经有租户ID、Azure应用的密钥,还配置了权限,那客户端凭证授权流(Client Credentials Flow)就是完美的解决方案——这是专门为服务到服务的场景设计的,完全不需要用户登录或输入Outlook账号密码。

先确认关键前提

在开始写代码前,先检查这几点:

  • 你在Azure AD应用注册里添加的是应用权限(不是委派权限),比如Mail.ReadDirectory.Read.All这类;
  • 已经点击了授予管理员同意(必须是全局管理员或权限对应的管理员操作,不然令牌会没有权限);
  • 你的客户端密钥(Client Secret)是有效的,没有过期。

PHP Curl实现代码

直接用下面的代码,把占位符替换成你的实际信息就行:

<?php
// 替换成你的Azure AD信息
$tenantId = "你的租户ID";
$clientId = "你的应用客户端ID";
$clientSecret = "你的应用客户端密钥";

// 请求令牌的URL
$tokenUrl = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token";

// 请求参数
$postData = [
    'grant_type' => 'client_credentials',
    'client_id' => $clientId,
    'client_secret' => $clientSecret,
    'scope' => 'https://graph.microsoft.com/.default'
];

// 初始化Curl
$ch = curl_init();

// 设置Curl选项
curl_setopt($ch, CURLOPT_URL, $tokenUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 生产环境保持开启,不要关闭

// 执行请求并获取响应
$response = curl_exec($ch);
curl_close($ch);

// 解析JSON响应
$tokenData = json_decode($response, true);

// 检查是否成功获取令牌
if (isset($tokenData['access_token'])) {
    echo "成功获取访问令牌:" . $tokenData['access_token'];
    // 接下来就可以用这个令牌调用Microsoft Graph API了,比如:
    // $graphUrl = "https://graph.microsoft.com/v1.0/users";
    // $graphCh = curl_init($graphUrl);
    // curl_setopt($graphCh, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . $tokenData['access_token']]);
    // curl_setopt($graphCh, CURLOPT_RETURNTRANSFER, true);
    // $graphResponse = curl_exec($graphCh);
    // curl_close($graphCh);
} else {
    echo "获取令牌失败:" . $tokenData['error_description'] ?? '未知错误';
}
?>

关键说明

  • scope参数必须设为https://graph.microsoft.com/.default,这个值会告诉Azure AD使用你在应用注册里配置的所有应用权限;
  • 客户端凭证流获取的令牌是应用级别的,代表你的应用本身去访问Graph API,而不是某个用户;
  • 生产环境里不要把客户端密钥硬编码在代码里,建议用环境变量或者安全的配置管理工具来存储。

备注:内容来源于stack exchange,提问作者Bharvi Manvar

火山引擎 最新活动