次の方法で共有


チュートリアル: Angular アプリケーションを作成し、認証用に準備する

登録が完了したら、Angular CLI (コマンド ライン インターフェイス) を使用して Angular プロジェクトを作成できます。 このチュートリアルでは、Angular CLI を使用してシングルページの Angular アプリケーションを作成し、認証と承認に必要なファイルを作成する方法について説明します。

このチュートリアルの内容:

  • 新しい Angular プロジェクトを作成する
  • アプリケーションの設定を構成する
  • アプリケーションに認証コードを追加する

前提条件

新しい Angular プロジェクトを作成する

Angularプロジェクトを最初から作成するには、次の手順を実行します。

  1. ターミナル ウィンドウを開き、次のコマンドを実行して、新しい Angular プロジェクトを作成します。

    ng new msal-angular-tutorial --routing=true --style=css --strict=false
    

    このコマンドにより、ルーティングが有効で、スタイル設定が CSS で、厳密モードが無効になっている msal-angular-tutorial という名前の Angular プロジェクトが新しく作成されます。

  2. プロジェクト ディレクトリに移動します。

    cd msal-angular-tutorial
    
  3. 依存関係をインストールします。

    npm install @azure/msal-browser @azure/msal-angular bootstrap
    

    コマンド npm install @azure/msal-browser @azure/msal-angular bootstrap により、Azure MSAL ブラウザー、Azure MSAL Angular、ブートストラップ パッケージがインストールされます。

  4. angular.json を開き、ブートストラップの CSS パスを styles 配列に追加します。

    "styles": [
        "src/styles.css",
        "node_modules/bootstrap/dist/css/bootstrap.min.css"
    ],
    

    このコードにより、ブートストラップ CSS が angular.json ファイル内のスタイル配列に追加されます。

  5. ホーム コンポーネントとプロファイル コンポーネントを生成します。

    ng generate component home
    ng generate component profile
    

    このコマンドにより、Angular プロジェクトでホーム コンポーネントとプロファイル コンポーネントが生成されます。

  6. 不要なファイルとコードをプロジェクトから削除します。

    rm src/app/app.component.css
    rm src/app/app.component.spec.ts
    rm src/app/home/home.component.css
    rm src/app/home/home.component.spec.ts
    rm src/app/profile/profile.component.css
    rm src/app/profile/profile.component.spec.ts
    

    このコマンドを実行すると、不要なファイルとコードがプロジェクトから削除されます。

  7. Visual Studio Code を使用して app.routes.ts の名前を app-routing.module.ts に変更し、アプリケーション全体で app.routes.ts のすべての参照を更新します。

  8. Visual Studio Code を使用して app.config.ts の名前を app.module.ts に変更し、アプリケーション全体で app.config.ts へのすべての参照を更新します。

これらの手順を完了すると、プロジェクト構造は次のようになります。

.
├── README.md
├── angular.json
├── package-lock.json
├── package.json
├── src
│   ├── app
│   │   ├── app-routing.module.ts
│   │   ├── app.component.html
│   │   ├── app.component.ts
│   │   ├── app.module.ts
│   │   ├── home
│   │   │   ├── home.component.html
│   │   │   └── home.component.ts
│   │   └── profile
│   │       ├── profile.component.html
│   │       └── profile.component.ts
│   ├── index.html
│   ├── main.ts
│   ├── polyfills.ts
│   └── styles.css
├── tsconfig.app.json
└── tsconfig.json

アプリケーションの設定を構成する

アプリの登録時に記録された値を使用して、認証用にアプリケーションを構成します。 次のステップを実行します。

  1. src/app/app.module.ts ファイルを開き、その内容を次のコードに置き換えます。

    // Required for Angular multi-browser support
    import { BrowserModule } from '@angular/platform-browser';
    
    // Required for Angular
    import { NgModule } from '@angular/core';
    
    // Required modules and components for this application
    import { AppRoutingModule } from './app-routing.module';
    import { AppComponent } from './app.component';
    import { ProfileComponent } from './profile/profile.component';
    import { HomeComponent } from './home/home.component';
    
    // HTTP modules required by MSAL
    import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
    
    // Required for MSAL
    import { IPublicClientApplication, PublicClientApplication, InteractionType, BrowserCacheLocation, LogLevel } from '@azure/msal-browser';
    import { MsalGuard, MsalInterceptor, MsalBroadcastService, MsalInterceptorConfiguration, MsalModule, MsalService, MSAL_GUARD_CONFIG, MSAL_INSTANCE, MSAL_INTERCEPTOR_CONFIG, MsalGuardConfiguration, MsalRedirectComponent } from '@azure/msal-angular';
    
    const isIE = window.navigator.userAgent.indexOf('MSIE ') > -1 || window.navigator.userAgent.indexOf('Trident/') > -1;
    
    export function MSALInstanceFactory(): IPublicClientApplication {
      return new PublicClientApplication({
        auth: {
          // 'Application (client) ID' of app registration in the Microsoft Entra admin center - this value is a GUID
          clientId: "Enter_the_Application_Id_Here",
          // Full directory URL, in the form of https://login.microsoftonline.com/<tenant>
          authority: "https://login.microsoftonline.com/Enter_the_Tenant_Info_Here",
          // Must be the same redirectUri as what was provided in your app registration.
          redirectUri: "http://localhost:4200",
        },
        cache: {
          cacheLocation: BrowserCacheLocation.LocalStorage,
          storeAuthStateInCookie: isIE
        }
      });
    }
    
    // MSAL Guard is required to protect routes and require authentication before accessing protected routes
    export function MSALGuardConfigFactory(): MsalGuardConfiguration {
      return { 
        interactionType: InteractionType.Redirect,
        authRequest: {
          scopes: ['user.read']
        }
      };
    }
    
    // Create an NgModule that contains the routes and MSAL configurations
    @NgModule({
      declarations: [
        AppComponent,
        HomeComponent,
        ProfileComponent
      ],
      imports: [
        BrowserModule,
        AppRoutingModule,
        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 { }
    

    このコードにより、ユーザー認証と API 保護のために MSAL を設定されます。 これにより API 要求を保護する MsalInterceptor と、ルートを保護する MsalGuard でアプリが構成され、さらに認証のためのコンポーネントとサービスが定義されます。 次の値を Microsoft Entra 管理センターから取得した値に置き換えます。

    • Enter_the_Application_Id_Here を、アプリ登録の Application (client) ID に置き換えます。
    • Enter_the_Tenant_Info_Here を、アプリ登録の Directory (tenant) ID に置き換えます。
  2. ファイルを保存します。

アプリケーションに認証コードを追加する

MSAL Angular を使用してユーザー認証とセッション管理を処理するには、src/app/app.component.ts を更新する必要があります。

  1. src/app/app.component.ts ファイルを開き、内容を次のコードに置き換えます。

    // Required for Angular
    import { Component, OnInit, Inject, OnDestroy } from '@angular/core';
    
    // Required for MSAL
    import { MsalService, MsalBroadcastService, MSAL_GUARD_CONFIG, MsalGuardConfiguration } from '@azure/msal-angular';
    import { EventMessage, EventType, InteractionStatus, RedirectRequest } from '@azure/msal-browser';
    
    // Required for RJXS
    import { Subject } from 'rxjs';
    import { filter, takeUntil } from 'rxjs/operators';
    
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html'
    })
    export class AppComponent implements OnInit, OnDestroy {
      title = 'Angular - MSAL Example';
      loginDisplay = false;
      tokenExpiration: string = '';
      private readonly _destroying$ = new Subject<void>();
    
      constructor(
        @Inject(MSAL_GUARD_CONFIG) private msalGuardConfig: MsalGuardConfiguration,
        private authService: MsalService,
        private msalBroadcastService: MsalBroadcastService
      ) { }
    
      // On initialization of the page, display the page elements based on the user state
      ngOnInit(): void {
        this.msalBroadcastService.inProgress$
            .pipe(
            filter((status: InteractionStatus) => status === InteractionStatus.None),
            takeUntil(this._destroying$)
          )
          .subscribe(() => {
            this.setLoginDisplay();
          });
    
          // Used for storing and displaying token expiration
          this.msalBroadcastService.msalSubject$.pipe(filter((msg: EventMessage) => msg.eventType === EventType.ACQUIRE_TOKEN_SUCCESS)).subscribe(msg => {
          this.tokenExpiration=  (msg.payload as any).expiresOn;
          localStorage.setItem('tokenExpiration', this.tokenExpiration);
        });
      }
    
      // If the user is logged in, present the user with a "logged in" experience
      setLoginDisplay() {
        this.loginDisplay = this.authService.instance.getAllAccounts().length > 0;
      }
    
      // Log the user in and redirect them if MSAL provides a redirect URI otherwise go to the default URI
      login() {
        if (this.msalGuardConfig.authRequest) {
          this.authService.loginRedirect({ ...this.msalGuardConfig.authRequest } as RedirectRequest);
        } else {
          this.authService.loginRedirect();
        }
      }
    
      // Log the user out
      logout() {
        this.authService.logoutRedirect();
      }
    
      ngOnDestroy(): void {
        this._destroying$.next(undefined);
        this._destroying$.complete();
      }
    }
    

    このコードは、MSAL と Angular を統合してユーザー認証を管理します。 これはサインイン状態の変更をリッスンして、サインイン状態を表示し、トークン取得イベントを処理して、Microsoft Entra の構成に基づいてユーザーをログインまたはログアウトさせる手段を提供します。

  2. ファイルを保存します。

次のステップ