Angular - 动态包含或删除拦截器

标签 angular azure-ad-msal angular-http-interceptors msal-angular

是否可以动态包含或排除拦截器?

例如,我想使用 Microsoft 的 @azure/msal-angular 包在我的应用程序中启用基于 Azure AD 的 SSO https://www.npmjs.com/package/@azure/msal-angular它提供了一个拦截器。但是,我希望我的应用程序以两种模式运行 - 一种使用基于 msal 包提供的拦截器的 SSO,另一种不使用(即将身份验证路由到其他后端服务器而不是 azure AD)。因此,如果选择了 SSO 模式,我希望包含 msal 拦截器;如果用户在运行时未选择 SSO 模式,我希望排除此拦截器。如何根据用户在登录屏幕上选择的内容动态实现此功能?更多详情如下:

下面是微软提供的示例应用程序,它使用他们的包进行身份验证 https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-angular-v2-samples/angular11-sample-app

示例应用程序的

app.module.ts 具有以下包含 msal 拦截器 的方式(包含片段) 。这始终将 http 路由到 Azure AD 进行身份验证。如果我的用户不想要这种类型的身份验证,我如何动态删除它?

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent,
    ProfileComponent,
    DetailComponent,
    LogoutComponent
  ],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,
    AppRoutingModule,
    MatButtonModule,
    MatToolbarModule,
    MatListModule,
    MatMenuModule,
    HttpClientModule,
    MsalModule
  ],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: MsalInterceptor,
      multi: true
    },
    {
      provide: MSAL_INSTANCE,
      useFactory: MSALInstanceFactory
    },
    {
      provide: MSAL_GUARD_CONFIG,
      useFactory: MSALGuardConfigFactory
    },
    {
      provide: MSAL_INTERCEPTOR_CONFIG,
      useFactory: MSALInterceptorConfigFactory
    },
    MsalService,
    MsalGuard,
    MsalBroadcastService
  ],
  bootstrap: [AppComponent, MsalRedirectComponent]
})
export class AppModule { }

最佳答案

您可以添加环境变量标志(例如 sso),并根据其值添加 msal 提供程序。

environment.dev.ts

export const ENVIRONMENT = {
   ..........,
   sso: false,
   ..........,
};

environment.prod.ts

export const ENVIRONMENT = {
   ..........,
   sso: true,
   ..........,
};

app.module.ts

const MSAL_PROVIDERS = [
  { provide: HTTP_INTERCEPTORS, useClass: MsalInterceptor, multi: true },
  { provide: MSAL_INSTANCE, useFactory: MSALInstanceFactory },
  { provide: MSAL_GUARD_CONFIG, useFactory: MSALGuardConfigFactory },
  { provide: MSAL_INTERCEPTOR_CONFIG, useFactory: MSALInterceptorConfigFactory },
  MsalService,
  MsalGuard,
  MsalBroadcastService
]

@NgModule({
  declarations: [ ....... ],
  imports: [ ....... ],
  providers: [
    ............,
    ENVIRONMENT.sso ? MSAL_PROVIDERS : [] 
  ],
});

希望它能起作用。

关于 Angular - 动态包含或删除拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72810165/

相关文章:

javascript - 如何将我的 muse js 集成到我的 ionic 3 项目中

angular - 在 NativeScript/Angular 应用程序中使用 skipLocationChange 会导致 'skipped location' 短暂出现在屏幕上

node.js - 在Azure中部署Angular4通用应用程序无效的启动命令

typescript - 如何测试刷新和过期 token 场景?

angular - 将HttpHandler返回的Observable与HttpInterceptor中的另一个合并(Angular 8)

Angular 2 从 URL 访问子路由

angular - 通过 Azure 广告对 Angular 中的用户进行身份验证并授权 Blob 存储

javascript - 使用 idToken 或 accessToken 的 Azure AD 身份验证失败。我应该使用哪一个?

Angular 8 Intercept 调用刷新 token

Angular 6 样板仅具有基本功能(始终需要)?