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

如何在@azure/ms-rest-nodeauth的设备码流中指定scope

解决@azure/ms-rest-nodeauth设备登录流中Scope授权失败的问题

先帮你拆解下遇到的两个错误背后的核心原因,再给出具体的解决办法:

第一个错误(AADSTS650057)的根源

你调用interactiveLogin时没指定自己的clientId,所以默认用了Microsoft Azure CLI的官方客户端ID(04b07795-8ddb-461a-bbee-02f9e1bf7b46)。这个CLI应用的注册信息里,根本没添加你要访问的目标资源(5cf9ab4d-05af-4bc0-b7f9-6e4b0c236706)作为授权权限,Azure AD自然会直接拒绝你的资源访问请求。

第二个错误(AADSTS500011)的原因

你尝试把tokenAudience改成api://xxx/.default的格式,这本身是OAuth2客户端凭证流的正确scope格式,但问题出在两点:

  1. 依然用了默认的Azure CLI客户端ID,这个应用没有权限访问你的目标资源;
  2. 你的目标资源(api://5cf9ab4d-05af-4bc0-b7f9-6e4b0c236706)可能没在租户89d3889c-03f7-4b95-922c-393eefc1b12c中完成注册,或者你的应用没获得该资源的权限同意。

具体解决办法

方案1:继续使用@azure/ms-rest-nodeauth(不推荐,但可实现)

要绕开权限问题,你得注册自己的Azure AD应用并配置对应权限:

  1. 登录Azure门户,在Azure AD中创建一个应用注册,记录下生成的clientId;
  2. 在这个应用注册的API权限页面,添加目标资源(5cf9ab4d-05af-4bc0-b7f9-6e4b0c236706)的权限,如果是租户级应用,需要管理员完成管理员同意;
  3. 修改代码,传入自己的clientId和正确的tokenAudience:
const { interactiveLogin } = require('@azure/ms-rest-nodeauth');

async function authenticate() {
  try {
    const creds = await interactiveLogin({
      clientId: 'YOUR-CUSTOM-APP-CLIENT-ID', // 替换为你自己的应用ID
      domain: '89d3889c-03f7-4b95-922c-393eefc1b12c',
      tokenAudience: 'api://5cf9ab4d-05af-4bc0-b7f9-6e4b0c236706/.default'
    });
    const token = await creds.getToken();
    console.log('获取到的Token:', token);
  } catch (err) {
    console.error('登录失败:', err.message);
  }
}

authenticate();

方案2:改用@azure/identity(官方推荐,更灵活)

@azure/ms-rest-nodeauth属于较旧的SDK,Azure官方现在推荐用@azure/identity库,它对设备登录流的支持更完善,还能直接指定scopes:

  1. 先安装依赖:
npm install @azure/identity
  1. 编写代码(同样需要你自己的应用注册clientId):
const { DeviceCodeCredential } = require('@azure/identity');

async function authenticate() {
  const credential = new DeviceCodeCredential({
    tenantId: '89d3889c-03f7-4b95-922c-393eefc1b12c',
    clientId: 'YOUR-CUSTOM-APP-CLIENT-ID', // 替换为你自己的应用ID
    userPromptCallback: (info) => {
      console.log(info.message); // 打印设备登录提示,用户需访问指定URL并输入代码
    }
  });

  try {
    // 直接传入需要授权的scope
    const token = await credential.getToken('api://5cf9ab4d-05af-4bc0-b7f9-6e4b0c236706/.default');
    console.log('获取到的Token:', token);
  } catch (err) {
    console.error('登录失败:', err.message);
  }
}

authenticate();

最后要注意的点

  • 确保你的目标资源(5cf9ab4d-05af-4bc0-b7f9-6e4b0c236706)已经在租户89d3889c-03f7-4b95-922c-393eefc1b12c中完成注册(比如是一个Azure AD应用或者API);
  • 如果你的应用需要访问租户级资源,必须由管理员完成权限同意,否则普通用户无法完成授权;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:37:38