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

Azure OAuth获取Access Token遇invalid_grant错误(已解决)

问题根源

你第一个请求用的是隐式授权流(response_type=id_token),这个流程不会返回authorization_code——你拿到的应该是id_token,而非授权码。后续用这个无效值去调用token端点,自然会触发AADSTS9002313无效请求错误。


解决方案

根据你的应用配置,提供三种可行修复方案:

方案1:改用混合流同时获取id_token和authorization_code

如果需要授权码换取access token,把第一个授权请求改成混合流,指定response_type=id_token code,这样会同时返回id_token和有效的authorization_code:

GET https://login.microsoftonline.com/{{TenantID}}/oauth2/v2.0/authorize?
client_id={{ClientID}}&
response_type=id_token code&
redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Ftoken&
scope=openid {{其他所需权限,比如User.Read}}&
response_mode=form_post&
nonce=678910&
state=随机字符串(用于防CSRF)

拿到authorization_code后,再用你现有的token请求格式调用端点即可(注意scope要和授权请求完全一致)。

方案2:直接用隐式流获取access token

你的应用已开启"隐式流允许Access tokens",可以直接在第一个请求中指定response_type=token id_token,一次性拿到access token和id_token,无需调用token端点:

GET https://login.microsoftonline.com/{{TenantID}}/oauth2/v2.0/authorize?
client_id={{ClientID}}&
response_type=token id_token&
redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Ftoken&
scope=openid {{其他所需权限}}&
response_mode=form_post&
nonce=678910&
state=随机字符串

token会直接包含在响应的表单参数中(因使用response_mode=form_post)。

方案3:改用纯授权码流

如果不需要id_token,仅需access token,可使用纯授权码流,第一个请求指定response_type=code:

GET https://login.microsoftonline.com/{{TenantID}}/oauth2/v2.0/authorize?
client_id={{ClientID}}&
response_type=code&
redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Ftoken&
scope=openid {{其他所需权限}}&
response_mode=form_post&
state=随机字符串

拿到authorization_code后,用你现有的token请求调用端点即可。


额外注意事项

  1. scope参数在授权请求和token请求中必须完全一致(包括权限顺序),否则会触发错误。
  2. nonce仅在隐式/混合流中需要,纯授权码流可省略。
  3. 生产环境必须添加state参数,防止CSRF攻击。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:24:56