You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法获取refresh_token:Microsoft OAuth v1/v2端点权限与功能冲突求助

解决Outlook订阅API的OAuth2令牌矛盾问题

我明白你现在卡在了v1和v2端点的两难处境里:v1能拿刷新令牌但API调用失败,v2能创建订阅却没法持久化令牌。咱们一步步拆解解决:

核心问题根源

你遇到的两个问题本质是v1和v2端点的权限模型不兼容

  • v1端点的令牌对应的是旧版权限范围,无法访问Outlook的v2 API(也就是你调用的/subscriptions接口),所以会报401。
  • v2端点没拿到refresh_token,是因为你在管理员同意阶段没包含offline_access权限,后续单独加这个scope时,系统检测到该权限未被管理员同意,就抛出了AADSTS65001错误。

具体解决方案

1. 重新完成包含offline_access的管理员同意

管理员同意必须一次性覆盖所有需要的权限,不能事后追加。你需要重新构造adminconsent链接,把Outlook订阅所需的权限(比如邮件订阅用https://outlook.office.com/Mail.ReadWrite)和offline_access一起加入scope参数:

https://login.microsoftonline.com/common/adminconsent?client_id=你的应用ID&scope=https://outlook.office.com/Mail.ReadWrite offline_access&redirect_uri=你的回调地址

让管理员访问这个链接完成同意,这样你的应用就同时获得了访问Outlook API和获取刷新令牌的权限。

2. 走v2授权码流程获取完整令牌

完成管理员同意后,重新走v2的授权码流程:

  • 获取授权码时,scope参数同样带上https://outlook.office.com/Mail.ReadWrite offline_access
  • 调用https://login.microsoftonline.com/common/oauth2/v2.0/token端点,此时就能同时拿到access_tokenrefresh_token

3. 用v2令牌调用订阅API

拿到v2的access_token后,调用https://outlook.office.com/api/v2.0/Users('dummy@example.com')/subscriptions就能正常创建订阅,后续用refresh_token定期刷新access_token,不用重复走授权流程。

关键注意点

  • 确保应用注册是在v2端点(你已经在apps.dev.microsoft.com创建,这部分没问题),v1应用注册和v2权限模型不兼容。
  • 管理员同意的scope必须完整,后续新增权限需要重新走同意流程,否则会触发未授权错误。

内容的提问来源于stack exchange,提问作者gkb

火山引擎 最新活动