如何在Node.js版Azure Function中通过MSAL获取Azure DevOps PAT列表
问题根因
你看到的「Internet Explorer增强安全配置」报错是Azure DevOps身份校验失败时返回的HTML错误页的默认提示,和你运行环境的IE配置无关,本质是请求未携带有效授权信息或请求参数错误,具体问题出在以下几点:
- 配置变量引用错误:代码中
clientId、clientSecret、tenantId的赋值额外加了单引号,变成了固定字符串config.DEFAULT_CLIENT_ID,没有实际读取配置文件中的有效值,最终获取的访问令牌没有对应有效权限。 - 请求URL占位符未替换:接口地址中的
{organization}是官方文档的占位符,你没有替换为实际的Azure DevOps组织名称,导致请求目标地址无效。 - 无效请求参数冗余:
request-promise是Node.js服务端请求库,不支持mode、cache这类浏览器fetchAPI的参数,冗余参数可能导致请求格式异常。 - 权限配置缺失:使用客户端凭证流查询全组织PAT需要提前完成两个权限配置:
- AAD应用注册中为应用授予Azure DevOps的应用级权限,并完成租户管理员同意
- Azure DevOps组织设置中,将该AAD服务主体添加到
Project Collection Administrators用户组
修复后的代码示例
'use strict'; const config = require('../config'); const rp = require('request-promise'); const msal = require('@azure/msal-node'); module.exports = async function (context, req) { // 去掉引号,读取实际配置值 const clientId = config.DEFAULT_CLIENT_ID; const clientSecret = config.DEFAULT_CLIENT_SECRET; const tenantId = config.DEFAULT_TENANT_ID; // 替换为实际的DevOps组织名 const orgName = config.DEVOPS_ORG_NAME; const authorityUrl = `https://login.windows.net/${tenantId}`; const configuration = { auth: { clientId: clientId, authority: authorityUrl, clientSecret: clientSecret } }; const cca = new msal.ConfidentialClientApplication(configuration); const clientCredentialRequest = { scopes: ["499b84ac-1321-427f-aa17-267ca6975798/.default"], }; const credentials = await cca.acquireTokenByClientCredential(clientCredentialRequest); const apiToken = `${credentials.tokenType} ${credentials.accessToken}`; const url = `https://vssps.dev.azure.com/${orgName}/_apis/tokens/pats?api-version=6.1-preview.1`; const headers = { Authorization: apiToken }; const result = await rp({ url: url, json: true, headers: headers, method: 'GET' }); context.res = { body: result }; }
内容的提问来源于stack exchange,提问作者Param
相关产品推荐
相关产品推荐

