Node.js 使用节点为AAD应用程序创建用户访问令牌

Node.js 使用节点为AAD应用程序创建用户访问令牌,node.js,azure,azure-active-directory,Node.js,Azure,Azure Active Directory,对于测试场景,我想为AAD应用程序创建一个访问令牌,其ID为Application\u IDasaud声明 我使用Azure CLI创建了正确的令牌(在我使用公开API视图授权Azure CLI应用程序之后) 代码返回一个承载令牌,但我在使用它时得到了401。事实证明,aud声明的设置方式与Azure CLI不同。节点代码在值的前面加上spn:,这是SAML协议的一种记录行为(请参见第节) 我还尝试将。/oauth2/v2.0/tokenREST端点与grant\u type=password一

对于测试场景,我想为AAD应用程序创建一个访问令牌,其ID为
Application\u ID
as
aud
声明

我使用Azure CLI创建了正确的令牌(在我使用公开API视图授权Azure CLI应用程序之后)

代码返回一个承载令牌,但我在使用它时得到了
401
。事实证明,
aud
声明的设置方式与Azure CLI不同。节点代码在值的前面加上
spn:
,这是SAML协议的一种记录行为(请参见第节)

我还尝试将
。/oauth2/v2.0/token
REST端点与
grant\u type=password
一起使用,但无法获得任何令牌


我如何创建一个用户令牌,并将
APPLICATION\u ID
作为
aud
声明?

添加我的评论作为答案:

使用(意味着
grant\u type=password
)时,我们需要当前租户的Azure AD帐户,但不需要邀请帐户。您可以创建一个测试AD用户,以使用此流获取访问令牌。有关更多详细信息,请参阅

注意:Microsoft建议您不要使用ROPC流

如果您希望在没有用户登录的情况下获得令牌,则会更好

如果您希望使用已登录用户获取令牌,则可以使用。但是,每次请求获取令牌时,用户都需要登录浏览器

使用ADAL编写示例代码:


如果将资源指定为{Guid},则访问群体值将以
spn:
作为前缀。您可以将
GUID
替换为
ID-URI
,看起来像“api://xxx“或”https://graph.microsoft.com“


类似的问题:

事实证明,Azure CLI执行了三个步骤来创建特定于应用程序的访问令牌

  • 通过SAML验证用户凭据
  • 使用
    grant\u type:'urn:ietf:params:oauth:grant type:saml1\u-bearer'
  • 使用
    grant\u类型:“刷新\u令牌”请求特定于应用程序的授权
  • 我能够通过RESTAPI创建一个有效的令牌,而无需
    spn:
    前缀

    异步函数getToken():Promise{ const credentials=wait msRestNodeAuth.loginWithUsernamePassword( 用户名, 密码{ 域:租户ID, }, ); //模拟Azure CLI的“az帐户获取访问令牌”以避免spn:前缀 const{refreshToken}=(wait credentials.getToken()); const resp=等待axios.request({ 方法:“POST”, 网址:`https://login.microsoftonline.com/${TENANT\u ID}/oauth2/token`, 数据:qs.stringify({ 授予类型:“刷新令牌”, 客户端id:credentials.clientId, 资源:应用程序ID, 刷新令牌:刷新令牌, }), 标题:{'Content Type':'application/x-www-form-urlencoded'}, }); 返回resp.data.access_令牌; }
    您是否检查了关于ROPC流程的重要信息?@PamelaPeng是。它用于
    grant\u type=password
    方法。我收到
    AADSTS50126:由于用户名或密码无效,验证凭据时出错。
    作为错误消息。受邀加入Azure AD租户的个人帐户无法使用ROPC。您的帐户是否是类似于“xxx@{tenant name}.onmicrosoft.com”的Azure广告帐户?@PamelaPeng它不是个人帐户。它是一个Azure AD帐户,但由另一个Azure AD实例管理(来源:外部Azure Active Directory,创建类型:邀请)。除了可以通过编程方式创建用户令牌的ROPC之外,还有其他身份验证流吗?您可以在没有用户的情况下使用,也可以与登录用户一起使用。代码示例。谢谢。如何使用身份验证代码流以编程方式获取访问令牌,我并不清楚。
    adal节点
    文档看起来非常通用。请您提供一些额外的提示,好吗?使用MSAL.js 2.0和PKCE的更新的简单示例:
    $ az login -u <USERNAME> --allow-no-subscription
    $ az account get-access-token --tenant <TENANT_ID> --resource <APPLICATION_ID>
    
    async function getToken(): Promise<string> {
      const credentials = await msRestNodeAuth.loginWithUsernamePassword(
        USERNAME,
        PASSWORD, {
          domain: TENANT_ID,
          tokenAudience: APPLICATION_ID,
        },
      );
      return (await credentials.getToken()).accessToken;
    }
    
    async function getToken(): Promise<string> {
      const credentials = await msRestNodeAuth.loginWithUsernamePassword(
        USERNAME,
        PASSWORD, {
          domain: TENANT_ID,
        },
      );
      // Mimic Azure CLI`s 'az account get-access-token' to avoid spn: prefix
      const { refreshToken } = (await credentials.getToken());
      const resp = await axios.request<{ access_token: string }>({
        method: 'POST',
        url: `https://login.microsoftonline.com/${TENANT_ID}/oauth2/token`,
        data: qs.stringify({
          grant_type: 'refresh_token',
          client_id: credentials.clientId,
          resource: APPLICATION_ID,
          refresh_token: refreshToken,
        }),
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
      });
      return resp.data.access_token;
    }