MSAL - 使用 IneractionType.Redirect 时没有可用的令牌

MSAL - No Tokens Available when Using IneractionType.Redirect

在我们的应用程序中,我们使用 AAD 对用户进行身份验证,但我们使用本地 SQL 数据库中自己的用户和角色表对用户进行授权。

使用旧的 ADAL 库,我们能够 return 用户访问我们的回调 url,然后我们将从那里获取来自 ADAL 服务的 JWT 令牌,并将该令牌发送到我们的服务器。然后服务器将验证令牌,对其进行解码并获取电子邮件地址。然后,我们将 SQL 表用于 return 包含用户身份及其所有角色的另一个 JWT。

对于 MSAL,如果您使用 InteractionType.Popup,这仍然有效 。来自 loginPopup() 方法的响应 Observable 携带 AuthentiationResult,它有一个 idToken 属性 和一个 accessToken 属性。您可以轻松地拿起您需要的那个,然后就可以开始比赛了。

但是,InteractionType.Redirect 我们没有得到 AuthenticationResult。

我已将 msalService 实例注入到我们的 callbackURL 组件(称为 AuthCallbackComponent)中。我在 msalService 中到处寻找令牌,但找不到它们。我什至查看了 sessionStorage,我在其中配置了 MSAL 来缓存令牌。他们实际上在那里(在几个非常时髦的键下),但直到后来。无论我使用 ngOnInit、ngAfterViewInit 还是 ngAftercontentInit,令牌都还不存在。如果我将超时设置为 1-2 秒,它确实有效,但是......不。您永远不能真正依赖超时延迟对所有用户来说都足够长。

我们希望使用重定向工作流而不是弹出工作流,因此如果我们能够从 MSAL 实例中获取 idToken 就真的很理想。

我在这里 post 找到了这个:Retrieve token using msal,它提供了一些可能的解决方案,但这些建议没有帮助。它谈到了自定义 MSAL 拦截器,但这似乎是错误的。这通常是将令牌添加到服务调用的 headers 的 HTTP 拦截器。它还说您可以订阅回调并“使用 returned 令牌执行某些操作”,但假设它们指的是 msalService.loginRedirect() 方法的回调,那么这是错误的。它根本 return 什么都没有。

请记住,在旧的 ADAL 库中,这行得通。它仍然适用于 InteractionType.Popup(我们不能使用)。我希望这些标记必须在某个地方的 MSAL 实例中,否则有一个我们可以覆盖的方法、一个我们可以提供的回调等。

感谢您阅读这篇文章 post。

在 MSAL 上 10K 页的 Microsoft 文档的深处,我找到了这个事件参考:

https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-angular/docs/v2-docs/events.md#the-inprogress-observable

所以我使用他们的示例代码提出了我的解决方案,即将 msalBroadcastService 注入到我的 AuthCallbackComponent 中。我在那里订阅了它的 msalSubject$,当 LOGIN_SUCCESS 事件发生时,我可以从事件的有效负载中获取 accessToken 和 idToken。这是一些代码:

  ngOnInit(): void {
    this.msalBroadcastService.msalSubject$.pipe(filter((msg: EventMessage) => msg.eventType === EventType.LOGIN_SUCCESS)).subscribe(msg => {
      const idToken = (msg.payload as any).idToken;

      // now I can call my service method, passing in the idToken
  }