如何通过单个Azure AD应用调用Graph API与SharePoint REST API
核心原因
Graph API的访问令牌受众(aud字段)是https://graph.microsoft.com,而SharePoint REST API要求令牌受众匹配目标SharePoint站点的资源ID(比如https://domain.sharepoint.com),所以两类令牌无法混用。解决思路是用同一个Azure AD应用,针对两个API分别请求对应令牌,同时在Azure AD里配置好两类权限。
1. 配置Azure AD应用权限
在Azure AD门户的应用注册页面找到你的应用,进入API权限标签:
- Graph API权限:添加所需的应用/委派权限(比如
User.Read.All、SharePoint.Read.All),完成后点击授予管理员同意(仅应用权限需要此操作)。 - SharePoint权限:点击添加权限 → 选择SharePoint → 根据场景选择应用权限或委派权限(比如
Sites.Read.All,若需读取角色分配可能需要Sites.Manage.All),同样完成管理员同意。
注意:无需在
https://domain-admin.sharepoint.com/_layouts/15/appinv.aspx注册应用,Azure AD门户配置的权限已足够覆盖SharePoint REST API的访问需求。
2. 针对不同API请求访问令牌
客户端凭据流(应用权限场景)
请求Graph API令牌
指定scope为https://graph.microsoft.com/.default:
POST /{tenant-id}/oauth2/v2.0/token HTTP/1.1 Host: login.microsoftonline.com Content-Type: application/x-www-form-urlencoded client_id={你的应用ID}&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret={你的应用密钥}&grant_type=client_credentials
请求SharePoint REST API令牌
指定scope为目标站点的.default路径(比如https://domain.sharepoint.com/.default):
POST /{tenant-id}/oauth2/v2.0/token HTTP/1.1 Host: login.microsoftonline.com Content-Type: application/x-www-form-urlencoded client_id={你的应用ID}&scope=https%3A%2F%2Fdomain.sharepoint.com%2F.default&client_secret={你的应用密钥}&grant_type=client_credentials
委派权限场景(用户登录)
如果是用户授权的场景,scope替换为具体的权限值:
- Graph API:比如
https://graph.microsoft.com/User.Read.All - SharePoint REST API:比如
https://domain.sharepoint.com/Sites.Read.All
3. 调用SharePoint REST API示例
拿到SharePoint的令牌后,调用/_api/Web/RoleAssignments接口:
GET https://domain.sharepoint.com/_api/Web/RoleAssignments HTTP/1.1 Authorization: Bearer {SharePoint访问令牌} Accept: application/json;odata=nometadata
关键总结
- 同一个Azure AD应用可以支持两类API调用,核心是请求令牌时指定匹配目标API的scope。
- 跳过
appinv.aspx的前提是在Azure AD门户正确配置SharePoint权限并完成管理员同意,避免手动配置XML权限块。
内容的提问来源于stack exchange,提问作者Wajih Siddiqui
相关产品推荐
相关产品推荐

