MS Graph API令牌权限撤销问题(OAuth 2.0授权码流程)
MS Graph API令牌权限撤销问题(OAuth 2.0授权码流程)
我来帮你排查这个常见的MS Graph令牌失效问题,结合你描述的场景——初始授权正常、几天后刷新令牌拿新access token出现401/403,大概率是以下几个原因导致的,对应解决办法也给你列出来了:
1. 刷新令牌被提前吊销或过期
微软的刷新令牌默认有效期是90天,但如果出现以下情况,会被提前吊销:
- 用户修改了自己的微软账户密码
- 用户手动撤销了对你应用的授权(在微软账户的「已授权应用」列表里取消了你的应用权限)
- 租户管理员在Azure AD中撤销了应用的权限,或者限制了该用户的访问权限
解决办法:
- 在应用中捕获401/403错误,当检测到刷新令牌失效时,引导用户重新走OAuth 2.0授权码流程,获取新的访问令牌和刷新令牌
- 可以做个自动重试机制:第一次刷新失败后,直接触发重新授权,提升用户体验
2. 权限范围被变更或限制
你使用的openid profile email Mail.Read Mail.Send offline_access这些权限,如果后续出现以下情况,会导致刷新令牌失效:
- 租户管理员调整了应用的权限策略,比如降级了邮件相关的权限
- 用户的账户被移除了对应的邮箱访问权限(比如邮箱被注销或权限被收回)
解决办法:
- 登录Azure AD门户,检查你的应用权限配置,确认所有需要的权限都处于「已授予」状态
- 如果是委托权限(delegated permissions),确认用户的账户仍然拥有对应的资源访问权限(比如邮箱读写权限)
3. 刷新令牌请求参数错误
有时候刷新令牌时,参数配置错误也会触发401/403,常见的错误点:
grant_type没有设置为refresh_tokenscope和初始授权时的范围不一致(必须完全匹配,不能新增或减少权限)client_id或client_secret填写错误
解决办法:
- 检查你的刷新令牌请求体,确保参数完全正确,示例请求如下:
POST /token HTTP/1.1 Host: login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id=你的客户端ID &scope=openid%20profile%20email%20Mail.Read%20Mail.Send%20offline_access &refresh_token=你的刷新令牌 &grant_type=refresh_token &client_secret=你的客户端密钥(如果是机密客户端)
- 重点注意:
scope必须和第一次授权时完全一致,不能有任何变化
4. 条件访问策略限制
如果你的应用是多租户应用,或者用户所在租户开启了条件访问策略(比如要求MFA、限制访问地理位置等),当刷新令牌时不符合策略要求,就会返回401/403。
解决办法:
- 联系租户管理员,检查Azure AD的条件访问规则,确认你的应用是否被允许绕过或符合策略要求
- 如果是单租户应用,确认租户的条件访问配置没有变更
调试小技巧
- 用Postman手动发送刷新令牌请求,查看响应中的
error_description字段,微软会给出具体的失效原因(比如invalid_grant表示刷新令牌无效,interaction_required表示需要用户重新交互授权) - 查看Azure AD的审计日志,里面会记录令牌吊销、权限变更等操作,能帮你快速定位问题根源
备注:内容来源于stack exchange,提问作者Md Faizan




