如何无需Outlook账号登录,通过PHP Curl获取Microsoft Graph API访问令牌
如何无需Outlook账号登录,通过PHP Curl获取Microsoft Graph API访问令牌
嘿,我来帮你搞定这个问题!你已经有租户ID、Azure应用的密钥,还配置了权限,那客户端凭证授权流(Client Credentials Flow)就是完美的解决方案——这是专门为服务到服务的场景设计的,完全不需要用户登录或输入Outlook账号密码。
先确认关键前提
在开始写代码前,先检查这几点:
- 你在Azure AD应用注册里添加的是应用权限(不是委派权限),比如
Mail.Read、Directory.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




