已登录用户请求Azure Access Token时出现400 Bad Request错误
问题诊断与修复方案
核心问题分析
你遇到的400错误和超时,主要是以下几个参数不规范导致的:
- Scope不匹配:授权请求(STEP1)用的是
https://graph.microsoft.com/User.Read,但token请求里却用了https://graph.microsoft.com/OpenID,OAuth2要求token请求的scope必须和授权时的scope完全一致(或为其子集,不能超出授权范围),不一致会直接触发400错误。 - Redirect URI语法错误:代码里的
"https://"<MY_REDIRECT_URI>是PHP语法错误,字符串拼接必须用.,否则会导致redirect_uri参数缺失或格式混乱。 - 固定Content-Length:硬编码
Content-Length:1025完全不合理,POST请求体的长度是动态的,固定长度会让服务器判定请求体不完整,直接返回格式错误。 - 冗余POST设置:同时设置
CURLOPT_POST => 1和CURLOPT_CUSTOMREQUEST => "POST"属于冗余操作,可能引发潜在冲突。
修正后的PHP cURL代码
$curl = curl_init(); // 保持scope与授权请求完全一致 $scope = "https://graph.microsoft.com/User.Read"; // 修正redirect_uri的拼接语法 $redirectUri = "https://" . MY_REDIRECT_URI; $params = array( CURLOPT_URL => "https://login.microsoftonline.com/" . AZURE_TENANT_ID . "/oauth2/v2.0/token", CURLOPT_POST => 1, // 用http_build_query自动处理参数编码,避免手动拼接的乱码问题 CURLOPT_POSTFIELDS => http_build_query([ "code" => $_GET['code'], "grant_type" => "authorization_code", "scope" => $scope, "client_id" => AZURE_CLIENT_ID, "client_secret" => AZURE_CLIENT_SECRET, "redirect_uri" => $redirectUri ]), CURLOPT_RETURNTRANSFER => true, CURLOPT_MAXREDIRS => 4, CURLOPT_TIMEOUT => 30, CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'], CURLOPT_HTTPHEADER => array( "cache-control: no-cache", "Content-Type: application/x-www-form-urlencoded" // 移除固定Content-Length,cURL会自动计算并设置正确值 ), ); curl_setopt_array($curl, $params); $response = curl_exec($curl); // 添加错误捕获,便于排查超时或请求失败原因 if(curl_errno($curl)){ echo "CURL Error: " . curl_error($curl); } curl_close($curl); // 打印响应,方便调试时查看具体错误信息 var_dump($response);
额外调试建议
- 每次请求token前,打印
$_GET['code']和拼接后的POST参数,确认参数无乱码或缺失。 - 确保
AZURE_TENANT_ID、AZURE_CLIENT_ID、AZURE_CLIENT_SECRET等常量已正确定义,无拼写错误。 - 若仍出现超时,可尝试调整
CURLOPT_TIMEOUT的值,或检查服务器到Microsoft登录服务器的网络连通性。
内容的提问来源于stack exchange,提问作者user3521590
相关产品推荐
相关产品推荐

