MSAL 和 passporrt-azure-ad 无法验证令牌

MSAL and passporrt-azure-ad cannot verify token

我无法 link 我们的 API 应用程序中的 ReactJS 应用程序中的 Azure Active Directory 访问控制,并且通读了有关此事的文档给我留下的问题多于答案.

我首先按照 AAD Single-page app 场景中的说明开始,这很简单,允许我登录到我之前提到的 Web 上的 AAD 帐户。效果不错。

但是,在配置我们的 NodeJS 时 API,我有两个选择:A Web app that calls web APIs, and Protected web API

在一个调用 web APIs 的 Web 应用程序中,注册很简单,让我相信这是要走的路,但是代码配置页面指出只有 ASP,支持 Java 和 Python。我无法找到此场景的任何 Java 脚本示例,因此我转向受保护的 Web API。

同样,虽然我发现注册部分很容易理解,但代码配置页面仅列出了 .NET、NodeJS 中的示例(但仅适用于 App Functions,而不是独立的 API),以及Python。鉴于 NodeJS 示例足够接近独立的 API,我遵循该代码,在适当的地方替换我们的配置选项,因为它使用了我在其他地方看到的并且之前尝试过的 passport-azure-ad 包实施。但是,在这两种情况下,每次尝试对受保护端点进行 API 调用都会导致 API 记录以下内容:

“身份验证失败,原因是:在 Strategy.prototype.jwtVerify 中:无法验证令牌”

此外,我不确定这有多大关系,但我注意到当我在 ReactJS 应用程序上解码 ID 令牌和访问令牌时,ID 令牌版本为 2.0,但访问令牌为 1.0 .搜索 Github 问题和 Whosebug 表明其他人也观察到了这种行为,尽管我无法复制他们的过程以获得 v2.0 访问令牌,我怀疑但不确定是NodeJS API 无法验证令牌。

哦,我在客户端使用 MSAL.js 1.3 和 2.0 beta 时观察到相同的行为,以防有帮助。

评论讨论帮助我发现了一个在 MSAL 示例和文档中没有明确说明的解决方案,即 登录请求中的任何 MS Graph 范围(例如:“User.Read") 会将访问令牌从 v2.0 降级到 v1.0,这就是我收到带有 v1.0 访问令牌的 v2.0 ID 令牌的原因。

我从登录请求中删除了所有图形范围,API 范围是唯一剩下的范围,因此以下登录返回了 v2.0 访问令牌,随后由API 并启用了经过身份验证的访问。