【发布时间】:2021-05-02 00:51:55
【问题描述】:
对于一个测试场景,我想使用 APPLICATION_ID as aud 声明为 AAD 应用程序创建访问令牌。
我使用 Azure CLI 创建了正确的令牌(在我使用 公开 API 视图授权 Azure CLI 应用程序之后)。
$ az login -u <USERNAME> --allow-no-subscription
$ az account get-access-token --tenant <TENANT_ID> --resource <APPLICATION_ID>
我在 Node.js 中使用 @azure/ms-rest-nodeauth 尝试了类似的东西。
async function getToken(): Promise<string> {
const credentials = await msRestNodeAuth.loginWithUsernamePassword(
USERNAME,
PASSWORD, {
domain: TENANT_ID,
tokenAudience: APPLICATION_ID,
},
);
return (await credentials.getToken()).accessToken;
}
代码返回一个 Bearer 令牌,但我在使用它时得到了401。事实证明,aud 声明的设置方式与 Azure CLI 不同。节点代码以 spn: 为值添加前缀,这是 SAML 协议的记录行为(参见 Audience 部分)。
我还尝试将../oauth2/v2.0/token REST 端点与grant_type=password 一起使用,但无法获得任何令牌。
如何创建一个与 APPLICATION_ID 完全一致的用户令牌,就像 aud 声明的那样?
【问题讨论】:
-
你检查过document中关于ROPC流程的重要吗?
-
@PamelaPeng 是的。它用于
grant_type=password方法。我收到了AADSTS50126: Error validating credentials due to invalid username or password.作为错误消息。 -
受邀加入 Azure AD 租户的个人帐户无法使用 ROPC。您的帐户是类似于“xxx@{tenant-name}.onmicrosoft.com”的 Azure AD 帐户吗?
-
@PamelaPeng 这不是个人帐户。它是一个 Azure AD 帐户,但由另一个 Azure AD 实例管理(来源:外部 Azure Active Directory,创建类型:邀请)。除了 ROPC 之外,是否还有其他可以通过编程方式创建用户令牌的身份验证流程?
-
您可以在没有用户的情况下使用client credentials flow,或者在登录用户的情况下使用auth code flow。代码示例here.
标签: node.js azure azure-active-directory