Node.js后端基于Axios实现Azure AD认证获取访问令牌
现有代码问题修正与Azure令牌获取实现方案
一、现有代码的核心错误
- 语法层错误:配置中
knownAuthorities数组缺少闭合方括号,运行时会直接抛出语法异常 - 流程逻辑错误:
pca.getAuthCodeUrl()返回的链接是供终端用户浏览器跳转的登录授权入口,不属于服务端可直接调用的接口。服务端用Axios直接GET这个链接时,因为没有用户浏览器的登录会话上下文,Azure只会返回登录页HTML,完全拿不到授权码,从OAuth协议设计上这个操作就无法走通。
二、适配后端服务的Axios集成实现方案
根据你的服务是否需要代表终端用户获取令牌,分为两种可落地的实现路径:
方案1:纯后端无交互场景(最适配后端服务定位)
如果你的服务仅需以应用自身身份调用受Azure保护的接口(比如调用Graph API),完全不需要走重定向授权码流程,直接用Axios请求Azure令牌端点即可,无多余依赖、流程最短:
- 先在Azure应用注册后台,为应用分配对应的应用权限(非委托权限),并完成全局管理员同意
- 核心代码实现:
const axios = require('axios'); async function getAzureAdToken() { const tenantId = '你的租户ID'; const clientId = '应用注册时生成的客户端ID'; const clientSecret = '应用注册时生成的客户端密钥'; // Azure固定的v2.0令牌请求端点 const tokenEndpoint = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`; // 按Azure要求构造表单格式的请求体 const formBody = new URLSearchParams({ client_id: clientId, client_secret: clientSecret, scope: 'https://graph.microsoft.com/.default', // 替换为实际要访问的资源scope grant_type: 'client_credentials' }); const response = await axios.post(tokenEndpoint, formBody.toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); // 直接从响应中提取访问令牌 return response.data.access_token; }
方案2:需要代表终端用户获取令牌的场景
如果业务确实需要走授权码流程,代表特定用户拿访问令牌,Axios可以替代MSAL内置的HTTP请求模块,在拿到授权码后直接发起兑换请求,不需要硬套Express示例的路由结构,完整流程:
- 通过MSAL的
getAuthCodeUrl方法生成带nonce、state防重放参数的授权链接,将这个链接返回给前端,引导用户在浏览器中打开完成登录与权限同意 - Azure完成用户认证后,会带着
code参数302重定向到你配置的REDIRECT_URI,服务端接收到该重定向请求时,从URL query参数中取出通过校验的合法授权码 - 用Axios携带授权码请求令牌端点完成兑换,核心代码:
async function exchangeAuthCodeWithAxios(authorizationCode) { const tenantId = '你的租户ID'; const tokenEndpoint = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`; const formBody = new URLSearchParams({ client_id: '应用客户端ID', client_secret: '应用客户端密钥', code: authorizationCode, redirect_uri: 'http://localhost:3000/', // 必须和生成授权链接时配置的redirect_uri完全一致 grant_type: 'authorization_code', scope: 'user.read' }); const response = await axios.post(tokenEndpoint, formBody.toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); return response.data.access_token; }
三、关键注意事项
- 令牌请求的
Content-Type必须设置为application/x-www-form-urlencoded,Azure v2.0端点不支持JSON格式的换令牌请求 - 所有请求参数(客户端ID、重定向URI、权限范围)必须和Azure应用注册后台的配置完全匹配,否则会触发参数不匹配的授权错误
- 不要尝试用Axios直接请求授权链接绕过用户交互:授权环节在协议设计上要求由用户在浏览器端完成身份校验,服务端请求无法跳过该环节
内容的提问来源于stack exchange,提问作者Classic
相关产品推荐
相关产品推荐

