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

Node.js后端基于Axios实现Azure AD认证获取访问令牌

现有代码问题修正与Azure令牌获取实现方案

一、现有代码的核心错误

  • 语法层错误:配置中knownAuthorities数组缺少闭合方括号,运行时会直接抛出语法异常
  • 流程逻辑错误:pca.getAuthCodeUrl()返回的链接是供终端用户浏览器跳转的登录授权入口,不属于服务端可直接调用的接口。服务端用Axios直接GET这个链接时,因为没有用户浏览器的登录会话上下文,Azure只会返回登录页HTML,完全拿不到授权码,从OAuth协议设计上这个操作就无法走通。

二、适配后端服务的Axios集成实现方案

根据你的服务是否需要代表终端用户获取令牌,分为两种可落地的实现路径:

方案1:纯后端无交互场景(最适配后端服务定位)

如果你的服务仅需以应用自身身份调用受Azure保护的接口(比如调用Graph API),完全不需要走重定向授权码流程,直接用Axios请求Azure令牌端点即可,无多余依赖、流程最短:

  1. 先在Azure应用注册后台,为应用分配对应的应用权限(非委托权限),并完成全局管理员同意
  2. 核心代码实现:
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示例的路由结构,完整流程:

  1. 通过MSAL的getAuthCodeUrl方法生成带nonce、state防重放参数的授权链接,将这个链接返回给前端,引导用户在浏览器中打开完成登录与权限同意
  2. Azure完成用户认证后,会带着code参数302重定向到你配置的REDIRECT_URI,服务端接收到该重定向请求时,从URL query参数中取出通过校验的合法授权码
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 09:06:02