刷新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。
- 若为Web应用,确认重定向URI配置正确(本地开发的
scope参数不匹配
刷新token时指定的scope必须是首次授权时scope的子集,不能新增首次授权未包含的权限。核对首次授权与刷新请求的scope是否一致,避免因权限范围扩大导致token验证失败。
内容的提问来源于stack exchange,提问作者Sohayb Saleh

