调用OneDrive Graph API获取用户信息时遇403错误求排查
问题:调用Microsoft Graph API获取OneDrive信息返回403 Forbidden
按照官方文档,通过接口 https://graph.microsoft.com/v1.0/users/foo@bar.com/drive 获取用户OneDrive信息时,收到403 Forbidden错误。已知用户拥有商业账户,且凭证无误,需排查以下内容:
错误信息
( [status] => 500 [error] => Error fetching files: file_get_contents(https://...@bar.com/drive): Failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden )
补充信息
权限配置截图

认证代码(Client Credentials流程)
public static function authenticate($clientId, $tenantId, $clientSecret) { $url = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"; $postData = http_build_query([ 'client_id' => $clientId, 'scope' => 'https://graph.microsoft.com/.default', 'client_secret' => $clientSecret, 'grant_type' => 'client_credentials', ]); $options = [ 'http' => [ 'header' => "Content-Type: application/x-www-form-urlencoded ", 'method' => 'POST', 'content' => $postData, ], ]; $context = stream_context_create($options); $response = file_get_contents($url, false, $context); .... $body = json_decode($response, true); ... return $body['access_token']; }
用户概览截图

排查方向
- 权限是否完成管理员同意:从权限截图看配置了
Files.Read.All应用权限,但这类权限必须由全局管理员或SharePoint管理员手动授予同意,仅添加权限未确认同意会直接导致403,需在Azure AD中检查应用权限状态是否为“已授予”。 - 用户OneDrive初始化状态:部分新创建的商业账户用户,需首次登录OneDrive后才会生成个人站点,若OneDrive未完成初始化,调用接口会返回403,结合用户概览截图确认该用户OneDrive是否已正常启用。
- 令牌权限有效性:解码获取到的
access_token,检查roles字段是否包含Files.Read.All或对应读取权限,同时确认令牌受众(aud)为https://graph.microsoft.com、未过期。 - 租户级访问限制:排查租户是否设置了应用权限范围限制,比如禁止该应用访问特定用户的OneDrive资源,或配置了IP/地理位置访问策略拦截请求。
- API权限匹配度:确认
/users/{user-id}/drive接口所需权限配置正确,该接口支持的应用权限为Files.Read.All或Sites.Read.All,需确保已配置并授予对应权限。
内容的提问来源于stack exchange,提问作者Peter VARGA
相关产品推荐
相关产品推荐

