调用MS Graph API /drives接口时应用与Graph Explorer结果不一致问题
调用Microsoft Graph API /drives接口返回结果不一致问题
问题描述
使用Microsoft Graph API开发Azure AD应用时,调用https://graph.microsoft.com/v1.0/drives接口出现结果不一致:自研应用仅返回1个驱动器,部分Graph Explorer实例可返回全部可用驱动器,且应用已配置对应权限。
响应头对比
可返回全部驱动器的Graph Explorer响应头
{ "access-control-allow-origin": "https://graphtryit.azurewebsites.net", "access-control-expose-headers": "Content-Encoding,Server,Access-Control-Allow-Origin,Access-Control-Expose-Headers,Strict-Transport-Security,request-id,client-request-id,x-ms-ags-diagnostic,x-ms-resource-unit,OData-Version,X-FE-DATA", "cache-control": "public, must-revalidate, max-age=300", "client-request-id": "$$ID OMITED$$", "content-type": "application/json; odata.metadata=minimal; odata.streaming=true; IEEE754Compatible=false; charset=utf-8", "odata-version": "4.0", "request-id": "$$ID OMITED$$", "server": "Microsoft-IIS/10.0", "strict-transport-security": "max-age=31536000", "x-ms-ags-diagnostic": "$$OMITED$$" }
自研应用响应头
{ 'Cache-Control': 'no-store, no-cache', 'Transfer-Encoding': 'chunked', 'Content-Type':'application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'Strict-Transport-Security': 'max-age=31536000', 'request-id': '$$ID OMITED$$', 'client-request-id': '$$ID OMITED$$', 'x-ms-ags-diagnostic': '{"ServerInfo":{"DataCenter":"$$OMITED DIFFERENT SERVER$$"}}', 'OData-Version': '4.0', 'Date': 'Tue, 01 Nov 2022 17:52:48 GMT' }
无法返回全部驱动器的Graph Explorer响应头
{ "cache-control": "no-store, no-cache", "client-request-id": "$$ID OMITTED$$", "content-type": "application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8", "request-id": "$$ID OMITTED$$" }
关键发现
不同入口的Graph Explorer调用结果存在差异:其中一个入口调用/drives可返回全部驱动器,另一个入口则无法返回全部。
可能的原因分析
权限范围与上下文差异
- 不同Graph Explorer实例可能使用了不同的权限范围:能返回全量结果的实例可能请求了
Files.Read.All、Sites.Read.All这类覆盖所有驱动器的权限,而自研应用和另一个Graph Explorer实例仅请求了Files.Read这类仅限当前用户个人驱动器的权限。 - 若使用委托权限,用户身份的权限范围也会影响结果:比如用户是否拥有访问团队站点、共享库驱动器的权限;若使用应用权限,需确认是否完成管理员同意,未同意的应用权限仅能访问当前用户的个人驱动器。
- 不同Graph Explorer实例可能使用了不同的权限范围:能返回全量结果的实例可能请求了
缓存策略的间接影响
可返回全量结果的Graph Explorer启用了缓存(cache-control: public, must-revalidate, max-age=300),但缓存本身不会导致返回数量差异,除非旧缓存包含全量数据,而新请求因权限不足返回部分结果,但此场景概率较低。服务端实例差异
自研应用的响应头显示数据中心与Graph Explorer不同,但微软Graph API的服务逻辑是统一的,此因素导致结果差异的可能性极低,优先排查权限问题。
内容的提问来源于stack exchange,提问作者Michael Hearn
相关产品推荐
相关产品推荐

