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

使用Node.js版MSAL调用acquireTokenByCode时遇400错误求助

问题描述

使用Node.js版MSAL实现OAuth 2.0认证时,可正常获取授权码,但调用acquireTokenByCode接口获取令牌时出现以下400错误:

Network request failed. Please check network trace to determine root cause. | Fetch client threw: Error: HTTP status code 400 | Attempted to reach: https://login.microsoftonline.com/{myTenantId}/oauth2/v2.0/token

相关代码如下:

客户端实例代码

const msal = new ConfidentialClientApplication({
    auth: {
        clientId: process.env.MS_CLIENT_ID,
        clientSecret: process.env.MS_SECRET,
        authority: process.env.MS_AUTHORITY
    }
})

登录路由代码

const uri = await msal.getAuthCodeUrl({
  responseMode: 'query',
  redirectUri: `${process.env.APP_URI}/auth/code`,
  scopes: ['user.read']
});
res.redirect(uri);

令牌回调路由(/auth/code)代码

try {
  const {
    accessToken,
  } = await msal.acquireTokenByCode({
    scopes: ['user.read'],
    code: req.query.code,
    redirectUri: `${process.env.APP_URI}/auth/code`,
  });
  res.cookie('token', accessToken);
  res.redirect('/');
}
catch(e) {
  res.status(401).send(e);
}
可能的原因及解决方法
  • 检查redirectUri完全一致:getAuthCodeUrl和acquireTokenByCode中的redirectUri必须完全匹配,包括协议(http/https)、域名、端口、路径。比如本地开发时APP_URI是否带对了端口(如http://localhost:3000),不能出现拼写或格式差异。同时要确保Azure AD应用注册中已添加该回调地址,且类型设置为Web。
  • 验证客户端凭证正确性:
    • 确认clientSecret未过期、输入正确,环境变量MS_SECRET已正确加载
    • 检查authority格式是否正确,应为https://login.microsoftonline.com/{tenantId}或https://login.microsoftonline.com/common,确保环境变量MS_AUTHORITY无拼写错误
  • 确保授权码有效:
    • 授权码仅能使用一次,不可重复调用acquireTokenByCode,排查是否存在重复使用同一授权码的情况
    • 授权码有效期通常为10分钟,确认调用时授权码未过期
  • 核对请求参数一致性:acquireTokenByCode中的scopes必须和getAuthCodeUrl中的完全一致,不能多传或少传权限
  • 排查网络与端点问题:
    • 确认服务器可正常访问https://login.microsoftonline.com,无防火墙、代理拦截
    • 可通过curl直接调用token端点获取更详细错误信息,命令示例:
      curl -X POST https://login.microsoftonline.com/{myTenantId}/oauth2/v2.0/token \
      -H "Content-Type: application/x-www-form-urlencoded" \
      -d "client_id={clientId}&client_secret={clientSecret}&code={authCode}&redirect_uri={redirectUri}&grant_type=authorization_code&scope=user.read"
      
      返回的具体错误(如invalid_grant、redirect_uri_mismatch)可快速定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:06:19