使用Microsoft Graph API访问OneDrive报错:无法获取用户个人网站URL
问题:应用权限调用Microsoft Graph API获取用户OneDrive失败,报错“Unable to retrieve user's mysite URL”
已配置Files.ReadWrite.All和Sites.ReadWrite.All等应用权限,目标用户确实拥有在线OneDrive文件,但使用应用权限调用接口时无法查询到用户的Drive;使用该用户账号在Graph Explorer中以委托权限调用则可成功返回结果。
测试情况
- 调用
https://graph.microsoft.com/v1.0/users可正常返回用户列表 - 调用
https://graph.microsoft.com/v1.0/users/UPN-PLACEHOLDER可正常返回指定用户信息 - 调用
https://graph.microsoft.com/v1.0/users/UPN-PLACEHOLDER/drive和https://graph.microsoft.com/v1.0/users/UPN-PLACEHOLDER/drive/root均失败,报错Unable to retrieve user's mysite URL
测试代码
SCOPE = ["https://graph.microsoft.com/.default"] CLIENT_SECRET = "" TENENT_ID = "" APPLICATION_CLIENT_ID = "" AUTHORITY = "https://login.microsoftonline.com/" + TENENT_ID KFM_USER_ID = "" ENDPOINT = "https://graph.microsoft.com/v1.0/users/" + KFM_USER_ID # 此调用正常工作 ENDPOINT = "https://graph.microsoft.com/v1.0/users/" + KFM_USER_ID + "/drive" # 此调用失败 :( import msal app = msal.ConfidentialClientApplication(APPLICATION_CLIENT_ID, authority=AUTHORITY, client_credential=CLIENT_SECRET) result = app.acquire_token_for_client(scopes=SCOPE) graph_data = requests.get( ENDPOINT, headers={'Authorization': 'Bearer ' + result['access_token']}, ).json()
解决方案
这个报错的核心原因是应用权限模式下,Graph API无法通过用户上下文自动获取MySite(即OneDrive站点)的URL,而委托权限(如Graph Explorer使用的用户授权模式)可以依托用户会话获取相关信息。可尝试以下解决方法:
确认用户OneDrive已完成初始化
部分新创建的账号可能未触发OneDrive站点初始化,让用户手动登录一次OneDrive网页版,确保站点已创建完成。通过站点端点间接访问Drive
应用权限下可绕过/user/{id}/drive的直接调用,改用站点接口获取:- 先调用
https://graph.microsoft.com/v1.0/users/{user-id}/sites/root获取用户OneDrive对应的站点信息 - 再使用返回的
site-id调用https://graph.microsoft.com/v1.0/sites/{site-id}/drive获取Drive数据
- 先调用
验证权限状态
确认已为应用权限完成管理员同意操作,确保Files.ReadWrite.All和Sites.ReadWrite.All权限的状态为“已授予”,而非“需要管理员同意”。使用用户ID替代UPN
部分场景下,UPN可能存在解析异常,尝试使用用户的GUID格式ID替代UPN调用/users/{user-id}/drive接口。
内容的提问来源于stack exchange,提问作者user2154589
相关产品推荐
相关产品推荐

