如何在Node项目中调用Azure Kudu Rest API查询WebJob状态(遇401错误)
解决Azure App Service中MFA账号调用Kudu API查询WebJob状态的401问题
核心问题原因
启用MFA的用户账号无法通过密码进行Basic Auth调用Kudu API,Kudu不支持MFA用户的密码认证,必须改用部署凭据或托管标识。另外注意Kudu API的正确端点是带scm的子域名,即https://<你的应用名>.scm.azurewebsites.net/api/webjobs,而非你之前使用的不带scm的端点,这也是可能导致401的原因之一。
解决方案一:使用应用级部署凭据(简单快捷)
- 步骤1:在Azure门户中,进入目标App Service的部署中心 -> 部署凭据,设置或查看应用级凭据(区别于用户级凭据,应用级凭据与当前App Service绑定,不受用户MFA影响)。
- 步骤2:在Node.js代码中,使用该凭据进行Basic Auth调用:
const axios = require('axios'); const appName = '你的App Service名称'; const deployUsername = '应用级部署凭据用户名'; const deployPassword = '应用级部署凭据密码'; async function fetchWebJobsStatus() { try { const res = await axios.get(`https://${appName}.scm.azurewebsites.net/api/webjobs`, { auth: { username: deployUsername, password: deployPassword } }); console.log('WebJobs状态:', res.data); } catch (err) { console.error('查询失败:', err.response?.data || err.message); } } fetchWebJobsStatus();
解决方案二:使用托管标识(无密码,更安全)
适合生产环境,无需存储任何凭据:
- 步骤1:在Azure门户中,给运行WebJob的App Service启用系统分配托管标识(在标识 -> 系统分配中开启)。
- 步骤2:给该托管标识授予目标App Service的网站参与者或网站贡献者角色(进入目标App Service的访问控制(IAM) -> 添加角色分配,选择对应角色和托管标识)。
- 步骤3:Node.js代码中,先获取托管标识的访问令牌,再用Bearer Token认证调用Kudu API:
const axios = require('axios'); const appName = '你的App Service名称'; const targetResource = 'https://management.azure.com/'; async function getManagedIdentityToken() { const tokenRes = await axios.get('http://169.254.169.254/metadata/identity/oauth2/token', { params: { api_version: '2018-02-01', resource: targetResource }, headers: { 'Metadata': 'true' } }); return tokenRes.data.access_token; } async function fetchWebJobsStatus() { try { const token = await getManagedIdentityToken(); const res = await axios.get(`https://${appName}.scm.azurewebsites.net/api/webjobs`, { headers: { 'Authorization': `Bearer ${token}` } }); console.log('WebJobs状态:', res.data); } catch (err) { console.error('查询失败:', err.response?.data || err.message); } } fetchWebJobsStatus();
注意事项
- 应用级部署凭据不会随用户账号变更或MFA设置调整失效,适合长期使用。
- 托管标识仅能在Azure内部环境访问元数据服务获取令牌,若WebJob在本地调试需改用其他方式。
- 确保调用的Kudu API端点正确,必须包含
scm子域名。
内容的提问来源于stack exchange,提问作者Pratiyush Kumar
相关产品推荐
相关产品推荐

