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

自动化集成测试中如何获取Azure AD Bearer Token?

无浏览器自动化测试场景下,Node.js获取Azure AD Bearer Token的方案

针对你在无浏览器的集成测试场景中,需要调用受ADAL.js、passport-azure-ad保护的REST API的需求,这里提供两种适配Azure AD身份验证的Node.js实现方案,完全不需要浏览器交互:

方案一:客户端凭据流(推荐用于服务对服务测试)

这个流适合以应用本身的身份调用API,不需要模拟具体用户,是自动化测试中最安全可靠的方式,尤其适合后端API之间的调用场景。

前置准备

  1. 在Azure AD中注册一个测试专用的应用程序,记录下:
    • 租户ID(Tenant ID)
    • 客户端ID(Client ID)
    • 客户端密码(Client Secret,或者使用证书更安全)
  2. 给这个测试应用授予目标API的应用权限(注意不是委派权限),并完成管理员同意(如果权限需要的话)。

代码实现(使用微软官方最新SDK @azure/identity)

首先安装依赖:

npm install @azure/identity

然后编写获取Token的脚本:

const { ClientSecretCredential } = require("@azure/identity");

async function fetchBearerToken() {
  // 从环境变量或安全配置文件读取,不要硬编码!
  const tenantId = process.env.AZURE_TENANT_ID;
  const clientId = process.env.AZURE_CLIENT_ID;
  const clientSecret = process.env.AZURE_CLIENT_SECRET;
  // 目标API的资源ID,末尾加上.default表示使用应用权限
  const apiScope = "https://your-api-resource-identifier/.default";

  try {
    const credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
    const tokenResult = await credential.getToken(apiScope);
    return tokenResult.token;
  } catch (error) {
    console.error("获取Token失败:", error.message);
    throw error;
  }
}

// 调用示例:获取Token后调用API
async function callProtectedApi() {
  const token = await fetchBearerToken();
  const apiResponse = await fetch("https://your-api-endpoint", {
    method: "GET",
    headers: {
      "Authorization": `Bearer ${token}`
    }
  });
  
  console.log("API响应状态:", apiResponse.status);
  console.log("API响应内容:", await apiResponse.json());
}

callProtectedApi();

方案二:资源所有者密码凭据流(ROPC,仅适合内部测试)

如果你的测试必须模拟具体用户身份调用API,可以用这个流,但注意它有局限性:不支持开启MFA的用户,且需要用户的明文密码,不推荐在生产环境使用,仅适合内部受控测试场景。

前置准备

  1. 同样需要Azure AD应用注册,记录租户ID、客户端ID
  2. 给应用授予目标API的委派权限,并完成管理员同意(如果需要)
  3. 确保测试用户没有开启MFA,且是Azure AD组织内部账号

代码实现

同样使用@azure/identity库:

const { UsernamePasswordCredential } = require("@azure/identity");

async function fetchUserToken() {
  const tenantId = process.env.AZURE_TENANT_ID;
  const clientId = process.env.AZURE_CLIENT_ID;
  const username = process.env.TEST_USERNAME; // 格式:user@your-tenant-domain.com
  const password = process.env.TEST_USER_PASSWORD;
  // 替换为目标API的具体委派权限范围
  const apiScope = "https://your-api-resource-identifier/user_impersonation";

  try {
    const credential = new UsernamePasswordCredential(tenantId, clientId, username, password);
    const tokenResult = await credential.getToken(apiScope);
    return tokenResult.token;
  } catch (error) {
    console.error("获取用户Token失败:", error.message);
    throw error;
  }
}

// 调用API示例
async function callApiAsUser() {
  const token = await fetchUserToken();
  // 后续调用API的逻辑同上
}

callApiAsUser();

关键注意事项

  • Token验证适配:确保你的passport-azure-ad配置(比如BearerStrategy)能正确验证这两种方式获取的Token,尤其是客户端凭据流的Token,其受众(aud)是API的资源ID,issuer是Azure AD的租户地址。
  • 安全最佳实践:绝对不要把客户端密码、用户密码硬编码在代码中,用环境变量、密钥管理服务或者加密配置文件来存储敏感信息。
  • 权限检查:确认测试应用/用户拥有调用目标API所需的权限,否则会收到403或401错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:32:27