Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MSAL和passporrt azure ad无法验证令牌_Javascript_Azure Active Directory_Msal_Passport Azure Ad - Fatal编程技术网

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

Javascript MSAL和passporrt azure ad无法验证令牌,javascript,azure-active-directory,msal,passport-azure-ad,Javascript,Azure Active Directory,Msal,Passport Azure Ad,我无法将ReactJS应用程序中的Azure Active Directory访问控制链接到API,阅读有关此问题的文档给我留下的问题多于答案 我首先按照AAD场景中的说明开始,该场景非常简单,允许我登录到我前面提到的web上的AAD帐户。这很有效 然而,在配置nodejsapi时,我看到了两个选项:,和 在一个调用Web API的Web应用程序中,注册非常简单,这让我相信这是一条正确的道路,但是代码配置页面声明只支持ASP、Java和Python。我找不到这个场景的任何JavaScript示例

我无法将ReactJS应用程序中的Azure Active Directory访问控制链接到API,阅读有关此问题的文档给我留下的问题多于答案

我首先按照AAD场景中的说明开始,该场景非常简单,允许我登录到我前面提到的web上的AAD帐户。这很有效

然而,在配置nodejsapi时,我看到了两个选项:,和

在一个调用Web API的Web应用程序中,注册非常简单,这让我相信这是一条正确的道路,但是代码配置页面声明只支持ASP、Java和Python。我找不到这个场景的任何JavaScript示例,所以我转到受保护的Web API

类似地,虽然我发现注册部分很容易理解,但代码配置页面只列出了.NET、NodeJS(但仅适用于应用程序函数,而不是独立API)和Python中的示例。考虑到NodeJS示例与一个独立的API非常接近,我遵循了该代码,在适当的地方替换了我们的配置选项,因为它使用了我在别处看到的、以前尝试实现的包。但是,在这两种情况下,每次尝试对受保护端点进行API调用都会导致API记录以下内容:

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

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


哦,我在客户端使用MSAL.js 1.3和2.0测试版时也观察到了同样的行为,以防有所帮助。

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


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

注释讨论帮助我发现了一个解决方案,该解决方案在其他方面显然无法实现r在MSAL示例和文档中,登录请求中的任何MS Graph作用域(例如:“User.Read”)都会将访问令牌从v2.0降级到v1.0,这就是我接收v2.0 ID令牌和v1.0访问令牌的原因


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

前端使用的作用域是什么?请确保为您的应用程序请求访问令牌API使用API公开的作用域。若要获取v2令牌,API使用的应用注册必须定义它需要v2令牌。如给定教程所示,User.Read。我不确定定义它需要v2令牌是什么意思。您的意思是设置“accessTokenAcceptedVersion”吗“:2在舱单上?我已经为SPA和API应用程序注册做了这些(旁注,我应该只在一个或两个应用程序注册中做这些吗?我在API应用程序注册中做了一个范围(“Files.Read”),但在“添加范围”中没有说它是v1或v2哦,是的,作用域不是v1/v2,而是API接受的令牌的版本,它由您找到的属性控制。您需要做的是在Expose a API中定义一个作用域,并将完整的作用域id复制到您的应用程序中,然后使用它而不是User.Read。完整的作用域id将包括您的应用程序id URI。感谢您的快速回复。只需在我们进一步讨论之前,我只想确保我做的是正确的:我应该只注册一个应用程序,还是客户端和API都有单独的注册?在这两种情况下,我都使用了全范围id(“api:///Files.Read),并且API仍然记录“无法验证令牌”两种方法(一个应用程序注册/两个应用程序注册)工作。如果您不希望API被其他应用程序调用,那么将其全部放在一个应用程序注册中会更简单。您可以检查您获得的令牌吗?例如,aud声明应该与为您的API配置的一个有效访问群体相匹配。您在前端使用的作用域是什么?确保您请求ac通过使用API公开的作用域为您的API访问令牌。要获取v2令牌,您的API使用的应用注册必须定义它需要v2令牌。如给定教程所示,User.Read。我不确定您定义它需要v2令牌是什么意思。您是指设置“accessTokenAcceptedVersion”吗:2在清单中?我已经为SPA和API应用程序注册做了这些(旁注,我应该只在一个或两个应用程序注册中做这些吗?我在API应用程序注册中做了一个范围(“Files.Read”),但在“添加范围”中没有说它是v1或v2哦,是的,作用域不是v1/v2,而是API接受的令牌版本,它由您找到的属性控制