自动化集成测试中如何获取Azure AD Bearer Token?
无浏览器自动化测试场景下,Node.js获取Azure AD Bearer Token的方案
针对你在无浏览器的集成测试场景中,需要调用受ADAL.js、passport-azure-ad保护的REST API的需求,这里提供两种适配Azure AD身份验证的Node.js实现方案,完全不需要浏览器交互:
方案一:客户端凭据流(推荐用于服务对服务测试)
这个流适合以应用本身的身份调用API,不需要模拟具体用户,是自动化测试中最安全可靠的方式,尤其适合后端API之间的调用场景。
前置准备
- 在Azure AD中注册一个测试专用的应用程序,记录下:
- 租户ID(Tenant ID)
- 客户端ID(Client ID)
- 客户端密码(Client Secret,或者使用证书更安全)
- 给这个测试应用授予目标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的用户,且需要用户的明文密码,不推荐在生产环境使用,仅适合内部受控测试场景。
前置准备
- 同样需要Azure AD应用注册,记录租户ID、客户端ID
- 给应用授予目标API的委派权限,并完成管理员同意(如果需要)
- 确保测试用户没有开启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
相关产品推荐
相关产品推荐

