Инициализация MSAL Angular

Прежде чем использовать @azure/msal-angular, зарегистрируйте приложение в Microsoft Entra ID, чтобы получить clientId.

Включение и инициализация модуля MSAL в модуле приложения

Импортируйте MsalModule в app.module.ts. Чтобы инициализировать модуль MSAL, передайте идентификатор клиента приложения, который вы получаете из регистрации приложения.

import { NgModule } from '@angular/core';
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
import { AppComponent } from './app.component';
import { MsalModule, MsalService, MsalGuard, MsalInterceptor, MsalBroadcastService, MsalRedirectComponent } from "@azure/msal-angular";
import { PublicClientApplication, InteractionType, BrowserCacheLocation } from "@azure/msal-browser";

@NgModule({
    imports: [
        MsalModule.forRoot( new PublicClientApplication({ // MSAL Configuration
            auth: {
                clientId: "Your client ID",
                authority: "Your authority",
                redirectUri: "Your redirect Uri",
            },
            cache: {
                cacheLocation : BrowserCacheLocation.LocalStorage,
            },
            system: {
                loggerOptions: {
                    loggerCallback: () => {},
                    piiLoggingEnabled: false
                }
            }
        }), {
            interactionType: InteractionType.Redirect, // MSAL Guard Configuration
        }, {
            interactionType: InteractionType.Redirect, // MSAL Interceptor Configuration
        })
    ],
    providers: [
        {
            provide: HTTP_INTERCEPTORS,
            useClass: MsalInterceptor,
            multi: true
        },
        MsalService,
        MsalGuard,
        MsalBroadcastService
    ],
    bootstrap: [AppComponent, MsalRedirectComponent]
})
export class AppModule {}

Защита маршрутов в приложении

Добавьте проверку подлинности для защиты определенных маршрутов в приложении, добавив canActivate: [MsalGuard] его в определение маршрута. Добавьте его в родительские или дочерние маршруты. Когда пользователь посещает эти маршруты, библиотека предложит пользователю пройти проверку подлинности.

Дополнительные сведения см. в документацииMsalGuard по настройке и рекомендациям, включая использование дополнительных интерфейсов.

Ниже приведен пример маршрута, определенного с помощью MsalGuard:

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { ProfileComponent } from './profile/profile.component';
import { MsalGuard } from '@azure/msal-angular';

const routes: Routes = [
    {
        path: 'profile',
        component: ProfileComponent,
        canActivate: [MsalGuard]
    },
    {
        path: '',
        component: HomeComponent
    },
];

@NgModule({
    imports: [RouterModule.forRoot(routes)],
    exports: [RouterModule]
})
export class AppRoutingModule { }

Получение токенов для вызовов веб-API

@azure/msal-angular позволяет добавить перехватчик HTTP (MsalInterceptor) в app.module.ts следующим образом. MsalInterceptor будет получать токены и добавлять их ко всем вашим HTTP-запросам при вызовах API на основе protectedResourceMap. Дополнительные сведения о конфигурации и использовании см. в нашем документе msalInterceptor .

import { NgModule } from '@angular/core';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { AppComponent } from './app.component';
import { MsalModule, MsalService, MsalGuard, MsalInterceptor, MsalBroadcastService, MsalRedirectComponent } from "@azure/msal-angular";
import { PublicClientApplication, InteractionType, BrowserCacheLocation } from "@azure/msal-browser";

@NgModule({
    imports: [
        MsalModule.forRoot( new PublicClientApplication({ // MSAL Configuration
            auth: {
                clientId: "Your client ID",
                authority: "Your authority",
                redirectUri: "Your redirect Uri",
            },
            cache: {
                cacheLocation : BrowserCacheLocation.LocalStorage,
            },
            system: {
                loggerOptions: {
                    loggerCallback: () => {},
                    piiLoggingEnabled: false
                }
            }
        }), {
            interactionType: InteractionType.Redirect, // MSAL Guard Configuration
        }, {
            interactionType: InteractionType.Redirect, // MSAL Interceptor Configuration
            protectedResourceMap: new Map([
                ['https://graph.microsoft.com/v1.0/me', ['user.read']],
                ['https://api.myapplication.com/users/*', ['customscope.read']],
                ['http://localhost:4200/about/', null] 
            ])
        })
    ],
    providers: [
        {
            provide: HTTP_INTERCEPTORS,
            useClass: MsalInterceptor,
            multi: true
        },
        MsalService,
        MsalGuard,
        MsalBroadcastService
    ],
    bootstrap: [AppComponent, MsalRedirectComponent]
})
export class AppModule {}

Использование MsalInterceptor необязательно. Возможно, потребуется явно получить токены с помощью API acquireToken.

Обратите внимание, что MsalInterceptor предоставляется для удобства и может не соответствовать всем вариантам использования. Напишите собственный перехватчик, если у вас есть особые требования, которые не покрываются MsalInterceptor.

Оформление подписки на события

MSAL предоставляет систему событий, которая генерирует события, связанные с аутентификацией и MSAL. Чтобы использовать события, добавьте MsalBroadcastService в конструктор вашего компонента или службы.

1. Как подписаться на события

import { EventMessage, EventType } from '@azure/msal-browser';
import { filter } from 'rxjs/operators';

this.msalBroadcastService.msalSubject$
    .pipe(
        filter((msg: EventMessage) => msg.eventType === EventType.LOGIN_SUCCESS)
    )
    .subscribe((result) => {
        // do something here
    });

2. Доступные события

Найдите список событий, доступных в MSAL, в @azure/msal-browserдокументации по событиям.

3. Отмена подписки

Отмена подписки важна. Реализуйте ngOnDestroy() в своем компоненте, чтобы отменить подписку.

import { EventMessage, EventType } from '@azure/msal-browser';
import { filter, Subject, takeUntil } from 'rxjs';

private readonly _destroying$ = new Subject<void>();

this.msalBroadcastService.msalSubject$
    .pipe(
        filter((msg: EventMessage) => msg.eventType === EventType.LOGIN_SUCCESS),
        takeUntil(this._destroying$)
    )
    .subscribe((result) => {
        this.checkAccount();
    });

ngOnDestroy(): void {
    this._destroying$.next(null);
    this._destroying$.complete();
}

Дальнейшие действия

Вы готовы использовать @azure/msal-angularобщедоступные API.