You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

刷新Microsoft Access Token次日出现invalid_grant错误,求排查方案

问题描述

我开发了一款Web应用,支持用户关联个人Outlook账号以管理日历。用户授权后,可正常获取access token与refresh token,且30分钟内刷新token能成功拿到新的access token。但约一天后,调用刷新token接口时会触发invalid_grant错误,必须让用户重新登录Outlook才能获取有效access token。已在权限配置中加入offline_access,刷新请求的curl命令如下:

curl --location --request POST 'https://login.microsoftonline.com/common/oauth2/v2.0/token' \
--header 'Origin: http://localhost:4200' \
--header 'Authorization: Bearer ${Access_Token}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Cookie: fpc=AhDVWlE6NztJuqGq2Z_Q19xuuUk8AQAAAL3-ytsOAAAA; stsservicecookie=estsfd; x-ms-gateway-slice=estsfd' \
--data-urlencode 'client_id=f4c91f15-2a7c-4b57-836d-5b11dbd37981' \
--data-urlencode 'scope=user.read calendars.readwrite offline_access openid profile' \
--data-urlencode 'refresh_token=${Refresh_Token}' \
--data-urlencode 'grant_type=refresh_token'

错误截图:错误截图

排查方向及解决建议
  • 未更新refresh token
    微软个人账号的refresh token默认有效期为24小时,且每次调用刷新接口时,会返回新的refresh token,旧的token会立即失效。如果你的应用一直使用最初获取的旧refresh token,24小时后必然触发invalid_grant。需要确保每次刷新token后,用响应中的新refresh_token替换存储的旧值。

  • 多余请求头干扰
    刷新token的POST请求不需要携带Authorization: Bearer ${Access_Token}头,这个头是用于调用Microsoft Graph API接口时的身份验证,而非获取token的请求。直接去掉这个冗余头,避免影响认证逻辑。

  • 应用注册配置异常
    检查Azure AD应用注册的配置:

    • 若为Web应用,确认重定向URI配置正确(本地开发的http://localhost:4200没问题,生产环境要对应实际域名);
    • 确认应用未被设置为仅允许特定用户组访问;
    • 排查用户账号是否有变更,比如密码修改、账号锁定等情况,这类操作会直接撤销已颁发的refresh token。
  • scope参数不匹配
    刷新token时指定的scope必须是首次授权时scope的子集,不能新增首次授权未包含的权限。核对首次授权与刷新请求的scope是否一致,避免因权限范围扩大导致token验证失败。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:13:24