通过Postman调用MS Graph报表接口遇权限及令牌验证问题
我尝试通过Graph Explorer调用以下GET请求:https://graph.microsoft.com/v1.0/reports/microsoft.graph.getM365AppUserCounts(period='D7')
但遇到错误:
由于CORS策略,Graph Explorer中无法获取响应内容。你可以在Postman这类API客户端中执行此请求。
我在Azure门户中创建了新的应用注册并生成客户端密钥,尝试使用Id令牌和访问令牌均得到相同结果。
关于API权限,我不确定需要添加哪些权限才能访问M365应用使用情况报表(我需要查询Forms使用数据)。
随后我将MS Graph集合导入Postman工作区,在集合的Authorization标签中配置了以下信息:
Access Token URL: https://login.microsoft.com/<tenantID>/oauth2/token Client ID: (新应用注册ID) Client Secret: (新密钥)
令牌生成正常,我创建了自定义查询并设置继承父级授权,Headers中可见带令牌的Authorization头,但始终收到如下错误:
{ "error": { "code": "InvalidAuthenticationToken", "message": "访问令牌验证失败。受众无效。", "innerError": { "date": "2022-10-26T19:52:48", "request-id": "ggg-3d7b-ggg-a748-ggg", "client-request-id": "sdfg-3d7b-47d9-a748-sdfg" } } }
- 运行此类报表需要哪些API权限?
- 为何会出现令牌验证失败(受众无效)错误?是否因缺少scope?
- 若需要scope,应填写什么值?
我已将Postman中的scope更新为https://graph.microsoft.com/.default,并将Azure应用注册的API权限仅保留"Reports.Read.All - 应用程序",请求仍继承父级授权,但仍收到相同的"访问令牌验证失败。受众无效。"错误。
1. 所需API权限
访问M365应用使用情况报表(含Forms数据),必须添加Reports.Read.All应用程序权限,且需要全局管理员或报表管理员完成管理员同意操作。这类报表API仅支持应用权限模式,委托权限无法访问。
2. 受众无效错误原因
这个错误核心是令牌的aud(受众)声明不符合Microsoft Graph要求,常见诱因:
- 使用了v1.0的令牌获取端点
oauth2/token,该端点生成的令牌受众可能不是Graph API的正确地址 - 权限未完成管理员同意,导致令牌未包含对应权限的受众声明
- 应用注册的认证配置存在冲突,影响令牌生成逻辑
3. 正确的Scope值
对于应用程序权限流,正确的scope是https://graph.microsoft.com/.default,它会自动包含所有已授予该应用的应用程序权限,无需手动指定单个权限范围。
关键排查步骤
- 更换令牌获取端点:将Postman中的Access Token URL改为
https://login.microsoft.com/<tenantID>/oauth2/v2.0/token,v2.0端点生成的令牌更适配Graph API的受众要求 - 验证令牌内容:用jwt.ms解码生成的令牌,确认
aud字段值为https://graph.microsoft.com,若不符则说明令牌生成有误 - 确认权限已授权:在Azure门户的应用注册→API权限页面,检查
Reports.Read.All权限的状态是否为"已授予",若未授权需点击"授予管理员同意"按钮
内容的提问来源于stack exchange,提问作者dot

