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请求调用端点即可。
额外注意事项
scope参数在授权请求和token请求中必须完全一致(包括权限顺序),否则会触发错误。nonce仅在隐式/混合流中需要,纯授权码流可省略。- 生产环境必须添加
state参数,防止CSRF攻击。
内容的提问来源于stack exchange,提问作者Shiyou
相关产品推荐
相关产品推荐

