Android生产client_id调用Microsoft Graph登录报403 AuthFailureError
问题根因说明
你遇到的com.android.volley.AuthFailureError本质是接口返回403状态码导致的,因为换其他client_id时功能正常,说明代码逻辑、Volley封装、MSAL基础配置都没有问题,故障100%出在生产环境Azure AD应用注册的配置、或者获取token时的参数配置上。
排查解决步骤
- 第一步:验证token有效性
先把生产环境登录拿到的accessToken单独拿出来,用接口调试工具直接请求https://graph.microsoft.com/v1.0/me,请求头携带Authorization: Bearer <你的accessToken>,直接看返回的完整错误响应体,里面会带明确的错误码和错误原因,比Volley框架只抛出403状态码的信息全很多,可以直接定位问题。
同时可以把accessToken解码,检查两个核心声明:aud声明值必须是00000003-0000-0000-c000-000000000000(这是Microsoft Graph的固定资源标识),如果不是这个值,说明你拿到的token不是发给Graph接口的,调用必然403,需要检查获取token时传入的scope参数。scp声明里必须包含User.Read,这是调用/me接口的最低委托权限要求,如果没有这个值,说明权限配置错误。
- 第二步:检查生产应用的API权限配置
进入Azure门户找到生产环境对应的应用注册,进入「API权限」配置页:- 确认已经添加委托类型的Microsoft Graph
User.Read权限,不要误加应用类型的User.Read(应用类型权限是给后台服务用的,不适用用户登录的移动端场景)。 - 如果是单租户应用,添加权限后需要点击「授予管理员同意」,确保权限生效;如果是多租户应用,确认用户首次登录时走完了权限同意流程,没有被拦截。
- 确认已经添加委托类型的Microsoft Graph
- 第三步:检查获取token的scope参数
确认生产环境调用MSAL获取token时,传入的scope参数包含https://graph.microsoft.com/User.Read,不要错传成你自有后端服务的scope,也不要误用ID token代替access token调用Graph接口。 - 第四步:检查租户访问策略
如果前面的配置都没问题,检查生产应用所属的Azure租户有没有开条件访问策略,比如限制访问位置、要求设备合规、要求MFA多因素认证等,不符合策略要求的请求即使权限正确也会返回403,这时候接口返回的错误体里会带对应的AAD错误码,按提示调整策略或者满足合规要求即可。
你贴出的MSAL身份认证配置文件本身没有语法或逻辑错误,不需要在这个配置上花费排查时间。
内容的提问来源于stack exchange,提问作者M123
相关产品推荐
相关产品推荐

