我们将从Auth0迁移到MSAL,之前我们在APP_INITIALIZER中进行了身份验证,然后在那之后添加了其他异步调用.

return (): Promise<void> => {
    return new Promise((resolve) => {
      authService
        .processAuthenticationData()
        .then((res) => {
           // actions$.pipe(ofType(loadPermisions) and so on

我想在MSAL保持这种行为,但我正在努力做到这一点.

有没有人有过这种方法的经验,或者有任何如何实现它的提示或建议?谢谢

if (!msalService.instance.getActiveAccount()) {
    console.log("no logged in");
    msalService.loginRedirect();
  }
return () =>
    msalService.handleRedirectObservable().pipe(
      takeWhile((response) => !!response),
      tap((response) => {
        console.log("logged", response);
        if (response) {
          msalService.instance.setActiveAccount(response.account);
        }
      }),
    );

这不起作用,因为‘实例’必须激活用户,所以它保持重定向,而且我不确定重定向是否会导致APP_INITIALIZED取消,然后在重定向回来后重新开始?

  return () =>
    msalService.loginRedirect().pipe(
      tap(() => console.log('after login redirect')),
      concatMap(() =>
        msalService.handleRedirectObservable().pipe(
          tap((response) => {
            console.log("login reaction ", response);
            msalService.instance.setActiveAccount(response.account);
          }),
        ),
      ),
    );

这可能不起作用,因为handleReDirectObservable没有订阅它从登录重定向返回的重定向时间?

此外,还有msalBroadCastService,但我不确定是不是正确的方式.

推荐答案

事实证明,我离答案不远了."handleRedirectObservable"读取URI中的参数,如果参数不存在,则返回UNDEFINITED,以便您可以在以后登录.重定向将删除上下文,从登录重定向后将重新开始.

这种方法是有效的,如果您在服务中这样做,您可以对您的应用程序进行一些适当的初始化,如权限等.

export function appInitializationFactory(
  msalService: MsalService,
): () => Observable<any> {
  return () =>
    msalService.handleRedirectObservable().pipe(
      tap((response) => console.log("response from handle: ", response)),
      concatMap((response) => {
        if (!response && msalService.instance.getAllAccounts().length === 0) {
          console.log("No account found -> login");
          return msalService.loginRedirect();
        } else {
          console.log("Logged in! Set account etc.");
          return EMPTY;
        }
      }),
    );
}

Angular相关问答推荐

iOS Mobile Safari - HTML5视频覆盖一切

Angular前端调用ALB身份验证后的后端并重定向

无法执行客户端功能Angular 17与ssr'

Angular 16独立依赖注入问题

角路径S异步旋转变压器仍可观察到

Angular Mat Select 显示键盘焦点和鼠标悬停焦点的问题

IonicStorageModule似乎不是 NgModule 类

如何在 Angular 库中将依赖项声明为可选?

尽管模型中的变量发生了变化,但Angular 视图没有更新

如何为所有模块全局声明指令?

错误 TS1086:无法在 Angular 9 的环境上下文中声明访问器

由于时区,Angular 4 日期管道显示错误的日期 - 如何解决这个问题?

由router-outlet 创建时如何将css类应用于组件元素?

Angular 2中不同页面的多种布局

angular2 测试,我如何模拟子组件

在 2 个模块之间共享组件

RxJS - 发生错误时观察到的不会完成

如何使用无头浏览器运行测试?

路由 getCurrentNavigation 始终返回 null

如何在 Angular 中使用 router.navigateByUrl 和 router.navigate