如何使用 MSAL.js 为 Azure DevOps 获取有效的 AAD v2 令牌

Posted

技术标签:

【中文标题】如何使用 MSAL.js 为 Azure DevOps 获取有效的 AAD v2 令牌【英文标题】:How to get valid AAD v2 token using MSAL.js for Azure DevOps 【发布时间】:2019-05-16 05:22:16 【问题描述】:

ADAL.js 和 AAD v1 使用委托的 user_impersonation 范围访问 Azure DevOps。

我使用具有委派权限的相同 AAD 应用程序 ID 来使用 MSAL.js 生成访问令牌。令牌已成功创建,但访问令牌无法访问 Azure DevOps。

解码后的 JWT 令牌中唯一有意义的区别是“aud”声明不同。

在 ADAL/v1 中,aud 是 Azure DevOps 的应用程序 ID:

"aud": "499b84ac-1321-427f-aa17-267ca6975798"

在 MSAL/v1 中,aud 是 Azure DevOps 的唯一 uri:

"aud": "https://app.vssps.visualstudio.com"

是否有人能够使用具有 user_impersonation 委派权限的 MSAL.js 来访问 Azure DevOps REST API?如果是这样,是否缺少使 MSAL 工作的东西?

他们的 JWT 验证是否可能还没有考虑到第二个受众价值?

【问题讨论】:

【参考方案1】:

我认为您需要将“499b84ac-1321-427f-aa17-267ca6975798/.default”范围传递给 MSAL acquireTokenSilent。为您提供的令牌应该与 DevOps 一起使用。

myMsalInstance.acquireTokenSilent(['499b84ac-1321-427f-aa17-267ca6975798/.default'])

类似问题位于此处:Getting OAuth tokens for Azure DevOps API consumption

【讨论】:

【参考方案2】:

看起来 Azure DevOps 是一个 v1.0 应用程序,所以我试图让它在设置委派权限时 Azure 门户建议的错误 v2.0 范围内工作:

scopes: ['https://app.vssps.visualstudio.com/user_impersonation']

但是,根据doc,作用域在与 v1.0 应用程序对话时应使用资源 ID 作为前缀。这是 Azure DevOps 资源 ID 的工作范围:

scopes: ['499b84ac-1321-427f-aa17-267ca6975798/user_impersonation']

这解决了 aud 字段的问题,因此我再次拥有 499b84ac-1321-427f-aa17-267ca6975798 的 JWT aud 声明。

希望这有助于其他人在此问题上被阻止。

【讨论】:

你如何确定它是 1.0 应用程序? 谢谢,这在 2022 年仍然是一个问题,您的解决方案完美运行。

以上是关于如何使用 MSAL.js 为 Azure DevOps 获取有效的 AAD v2 令牌的主要内容,如果未能解决你的问题,请参考以下文章

Azure MSAL JS:如何编辑配置文件?

如何在不使用 ADAL.js 或 MSAL.js 的情况下将我的 activiti 应用程序(版本 6)与 Azure Active Directory 端点 v2.0 集成

Electron + Vue + msal-nodejs + Azure Ad:重定向 URL 问题

使用 MSAL Angular 包装器在 Ionic 4 中处理来自 Azure AD 的回调

如果用户从 msal .net 代码登录,则无法使用 msal.js 静默获取访问令牌

ADAL.js 和 MSAL.js 有啥区别?