Node.js 使用节点为AAD应用程序创建用户访问令牌
对于测试场景,我想为AAD应用程序创建一个访问令牌,其ID为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一
Application\u ID
asaud
声明
我使用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执行了三个步骤来创建特定于应用程序的访问令牌
grant\u type:'urn:ietf:params:oauth:grant type:saml1\u-bearer'
grant\u类型:“刷新\u令牌”请求特定于应用程序的授权
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;
}