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

Azure AD是否支持免费Office账户?Invalid grant错误排查求助

解决Azure AD认证Office账户时的AADSTS9002313错误

看起来你在集成Azure AD认证Outlook/OneDrive时碰到了棘手的AADSTS9002313错误——不管是付费的Office 365账户还是刚创建的免费账户都认证失败,但示例用户却能正常跑,这大概率是请求配置出了问题,咱结合错误代码和你的代码来拆解一下:

1. 重复设置HTTP头导致请求格式混乱

你的curl代码里犯了个常见的小错误:两次调用curl_setopt($ch, CURLOPT_HTTPHEADER, ...)。第一次你设置了包含POST方法、Host和Content-Type的完整请求头,第二次却只传了application/x-www-form-urlencoded,这直接把之前的头覆盖了,导致Azure AD收到的请求格式不完整,这是触发invalid_grant和AADSTS9002313的核心原因之一。

2. OAuth2端点与参数不匹配

你用的是v1版的认证端点/common/oauth2/token,但却设置了v2风格的scope参数https://graph.microsoft.com/.default。虽然v1端点也兼容部分v2参数,但更稳妥的做法是统一用v2版端点(/common/oauth2/v2.0/token),同时调整参数:

  • v2端点不需要resource参数,所有权限都通过scope指定
  • 要是用的是授权码流,得确保获取授权码时的scope和这里的完全一致,不然会触发权限不匹配的错误

3. curl初始化的冗余配置

你的代码里既在curl_init里写了带HTTP版本的URL,又用curl_setopt($ch, CURLOPT_URL, $url)重复设置,这可能导致URL解析异常,干脆统一用后者设置URL就好。

修正后的代码示例

$url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
$access_params = array(
    "grant_type" => "authorization_code",
    "code" => $authority, // 注意这里的$authority是你获取到的授权码,确保没传错
    "client_id" => "{clientid}", // 替换成你的应用客户端ID
    "client_secret" => "{secret}", // 替换成你的应用客户端密钥
    "scope" => "https://graph.microsoft.com/.default offline_access", // offline_access用来获取刷新令牌
    "redirect_uri" => "{redirecturi}" // 必须和获取授权码时的redirect_uri完全一致
);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
// 只设置必要的Content-Type头,curl会自动处理Host和POST方法
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-type: application/x-www-form-urlencoded"
));
// 必须用http_build_query编码参数,不然参数格式会出错
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($access_params));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);

$response = curl_exec($ch);
// 加上curl错误调试,方便排查问题
if(curl_errno($ch)){
    echo 'Curl请求错误: ' . curl_error($ch);
}
curl_close($ch);

var_dump($response);

关于免费Office账户的支持说明

先给你吃个定心丸:Azure AD**完全支持免费的个人Office账户(比如outlook.com结尾的账户)**和付费的Office 365商业账户,不过有两个注意点:

  • 注册Azure AD应用时,要选择“任何组织目录中的账户和个人Microsoft账户(例如Skype、Outlook)”的账户类型,不然个人账户没法授权
  • 付费的Office 365账户属于企业租户,要是你申请的是需要管理员同意的权限,得先让租户管理员审批才行

最后再检查几个细节:

  • 授权码只能用一次,要是你之前试过一次,得重新获取新的授权码
  • redirect_uri要和应用注册里填的、获取授权码时用的完全一致(包括大小写、末尾有没有斜杠)
  • 客户端ID和密钥别抄错,有没有多余的空格或者特殊字符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:37:25