Android使用MSAL获取Azure AD令牌调用SharePoint API时受众验证失败问题求助
哥们,你遇到的这个受众验证失败问题我之前做SharePoint集成时也踩过坑,核心原因其实很明确:你用MSAL获取的令牌受众(Audience)和SharePoint API要求的不匹配。
先给你拆解下问题:你之前用的Sites.FullControl.All是Microsoft Graph的权限 scope,MSAL默认会把这种scope对应到Graph的资源(https://graph.microsoft.com),所以你拿到的令牌是给Graph用的,而SharePoint REST API需要的是针对SharePoint租户资源的令牌,自然会触发受众验证失败的错误。
下面给你一步步的解决办法:
1. 先确认当前令牌的受众
把你获取到的access token复制到jwt.ms里解析(这是微软官方的JWT解析工具,本地就能用不用跳转),查看aud字段:
- 如果显示的是
https://graph.microsoft.com,那百分百是受众不对,这就是问题根源。 - 正确的
aud应该是你的SharePoint租户地址,比如https://your-company-name.sharepoint.com。
2. 修改MSAL请求的Scope配置
把你代码里的Scope数组改成针对SharePoint资源的格式:
原来的代码:
private final static String[] SCOPES = {"Sites.FullControl.All"};
替换成:
// 把your-company-name改成你实际的SharePoint租户域名 private final static String[] SCOPES = {"https://your-company-name.sharepoint.com/.default"};
这里的.default是OAuth 2.0的一种特殊scope,作用是让Azure AD返回你的应用注册中已配置的所有针对SharePoint的权限的令牌,不用单独指定具体权限名称。
3. 检查Azure AD应用注册的权限配置
登录Azure门户找到你的应用注册,重点检查这两点:
- API权限:确保添加的是SharePoint的权限(不是Microsoft Graph的),比如选择“SharePoint”后,添加委托权限或应用权限的
Sites.FullControl.All,并且已经点击“授予管理员同意”(应用权限必须要管理员同意,委托权限如果是用户交互式登录的话可以由用户自己授权,但为了避免问题建议先完成管理员同意)。 - Android平台配置:确认重定向URI的格式正确,应该是
msauth://<你的应用包名>/<签名哈希>,这个你之前的工作版本应该已经配置正确,但可以再核对下。
4. 验证修改后的令牌
重新运行APP获取令牌,再次用jwt.ms解析,确认aud字段已经变成你的SharePoint租户地址,这时候再调用SharePoint API就不会再报受众验证失败的错误了。
另外补充一点:如果你的需求是调用特定SharePoint站点的API,租户级的令牌完全可以正常使用,不需要额外针对单个站点调整资源配置,除非你的场景有特殊的权限隔离要求。
备注:内容来源于stack exchange,提问作者roberth

