我使用 @azure/msal-browser 和 @azure/msal-angular 包来简单地为我的登录用户检索 MSAL 令牌。由于我真正需要的只是令牌,因此我只在 app.module.ts 中提供了 MsalService 和 MSAL_INSTANCE。我正在使用重定向流,并选择自己订阅 .handleRedirectObservable() 方法,而不是使用 MsalRedirectComponent (以便我确切知道令牌何时可用)。
我的问题是,当重定向发生并且我被转发回我的应用程序时,有一段时间我的应用程序正在运行,但重定向交互仍未完全完成。如果我允许我的应用程序此时实际开始运行,它有可能会在令牌真正存在之前尝试使用它并导致错误。因此,我必须定义一个名为 isInteractionInProgress 的方法,并在实际开始执行我的应用程序之前在我的 app.component.ts 中调用它:
public isInteractionInProgress(): boolean {
for (let i = 0; i < sessionStorage.length; i+= 1) {
if (sessionStorage.getItem(sessionStorage.key(i)) === 'interaction_in_progress') {
return true;
}
}
return false;
}
由于我不知道生成 msal-angular 库用于存储“interaction_in_progress”值的密钥的可靠方法,因此我必须自己遍历会话存储并查找此密钥。如果它存在,那么我的应用程序知道一个 MSAL 令牌正在发送中,它需要等待。
有没有更好的解决方案?似乎这应该是我需要的:
this.msalBroadcastService.inProgress$
.pipe(
filter((status: InteractionStatus) => status === InteractionStatus.None),
takeUntil(this._destroying$)
)
.subscribe(() => {
// Do user account/UI functions here
})
但它所做的只是在“无”上激活两次,第二次“无”似乎是令牌实际可用的时候,但我不确定这是否属实。
那么有没有一种可靠的方法可以知道重定向何时实际发生?谢谢!