Azure AD OAuth隐式流调用token接口报错AADSTS90014求助
排查AADSTS90014 - Invalid Request错误的实用思路
先给你提个关键的小误区:你说用的是OAuth隐式流,但隐式流的逻辑是直接从/authorize端点返回Token,根本不需要调用/token接口——这很可能是你踩的第一个坑!如果你的实际需求是授权码流,那得先把流程对应上,AAD对不同OAuth流的参数要求差得挺多的。
下面给你梳理几个必查的方向:
1. 核对/token请求的必填参数
AAD的/token端点对授权码流有严格的参数要求,少一个或者错一个都会触发这个错误,你可以逐一对照:
grant_type:必须是authorization_code(授权码流专属),要是你真的用隐式流,那调用这个接口本身就不符合流程,直接会报错code:从/authorize拿到的授权码,注意这个码只能用一次,如果之前试过调用失败,得重新获取新的授权码client_id:必须和你在AAD注册应用时的客户端ID完全一致,大小写、字符都不能错redirect_uri:必须和应用注册里配置的重定向URI完全匹配,包括HTTP/HTTPS、端口、路径,差一个斜杠都会出问题- 如果你是SPA这类公共客户端,授权码流必须加
code_verifier(PKCE验证用),而且要和你在/authorize请求里的code_challenge对应上;如果是后端应用这类机密客户端,还得加client_secret或者客户端证书
2. 检查请求的Content-Type格式
POST请求的Content-Type必须是application/x-www-form-urlencoded,绝对不能用application/json——很多人用axios的时候会默认发JSON格式,这直接就会触发AADSTS90014错误。给你个正确的axios请求示例参考:
const tokenParams = new URLSearchParams(); tokenParams.append('grant_type', 'authorization_code'); tokenParams.append('code', '你的授权码'); tokenParams.append('client_id', '你的客户端ID'); tokenParams.append('redirect_uri', '你的重定向URI'); tokenParams.append('code_verifier', '你的PKCE验证器'); // SPA必填 axios.post('https://login.microsoftonline.com/organizations/oauth2/v2.0/token', tokenParams, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
3. 确认授权码的有效性
- 授权码的有效期只有10分钟,超时就会失效
- 授权码只能使用一次,哪怕第一次调用失败了,也得重新去
/authorize拿新的 - 还要确保
/authorize请求里的scope和/token请求的scope一致(或者/token可以省略scope,默认用授权时的范围),不匹配也可能报错
4. 检查AAD应用注册的配置
- 确认你的应用已经启用了对应的流程:如果是授权码流,要在应用注册的「身份验证」页面里,勾选「授权码流」(SPA还要勾选「允许公共客户端流」);如果是隐式流,勾选「ID令牌」或「访问令牌」,此时不需要调用
/token接口 - 重定向URI必须已经正确添加到应用注册中,比如
http://localhost:3000/callback和http://localhost:3000是两个完全不同的URI,不能混着用
5. 深挖错误响应的详细信息
AAD的错误响应里通常会有error_description字段,里面会有更具体的提示,比如「缺少grant_type参数」或者「redirect_uri不匹配」。你可以把axios返回的这个字段内容贴出来,能更快定位问题。
内容的提问来源于stack exchange,提问作者Johan Marais
相关产品推荐
相关产品推荐

