使用MSGraph-PHP-SDK连接US_GOV国家云失败的问题排查
解决MS Graph PHP SDK连接US_GOV国家云时的AADSTS900382错误
问题概述
使用MS Graph PHP SDK连接US_GOV国家云时,按官方文档配置NationalCloud::US_GOV后仍报错:
AADSTS900382: Confidential Client is not supported in Cross Cloud request.
通过PHP+Curl可正常访问租户并获取信息,但SDK中GraphPhpLeagueAuthenticationProvider未遵循国家云配置,仍使用全球版login.microsoftonline.com端点,导致跨云请求冲突。
解决方案
核心问题是ClientCredentialContext默认使用全球版Azure AD认证端点,需手动指定US_GOV环境的认证权威地址,确保认证与Graph API请求的云环境一致。
修改后的示例代码
<?php require_once 'vendor/autoload.php'; use Microsoft\Graph\Core\NationalCloud; use Microsoft\Graph\GraphServiceClient; use Microsoft\Kiota\Authentication\Oauth\ClientCredentialContext; $scopes = ['https://graph.microsoft.us/.default']; // 应用注册信息 $clientId = 'MY CLIENT ID'; $tenantId = 'MY TENANT ID'; $clientSecret = 'MY CLIENT SECRET'; // 指定US_GOV环境的认证权威地址 $authority = "https://login.microsoftonline.us/$tenantId"; $tokenRequestContext = new ClientCredentialContext($tenantId, $clientId, $clientSecret, $authority); $graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes, NationalCloud::US_GOV); $user = $graphServiceClient->users('USER@MYDOMAIN.COM')->get(); echo "<pre>"; print_r($user); echo "</pre>"; ?>
原理说明
- 默认
ClientCredentialContext会使用全球版Azure AD的权威端点(login.microsoftonline.com),即使GraphServiceClient指定了NationalCloud::US_GOV,认证上下文的端点未同步,导致认证请求发往全球云,而Graph API请求发往US_GOV云,触发跨云请求的权限限制。 - 手动指定US_GOV环境的权威地址(
login.microsoftonline.us)后,认证请求与Graph API请求将统一指向US_GOV云环境,解决AADSTS900382错误。
内容的提问来源于stack exchange,提问作者Zac Mussatt
相关产品推荐
相关产品推荐

