Compartilhar via


Tutorial: Adicionar login e logout na sua aplicação em uma única página com o Angular

Aplica-se a: Círculo verde com um símbolo de marca de seleção branco. Locatários da força de trabalho Círculo verde com um símbolo de marca de seleção branco. Locatários externos (saiba mais)

Este tutorial é a parte 2 de uma série que demonstra a criação de um SPA (aplicativo de página única) Angular e a adição de autenticação usando a plataforma de identidade da Microsoft. Na Parte 1 desta série, você criou um SPA Angular e adicionou configurações iniciais.

Neste tutorial, você:

  • Adicionar entrada e saída

Pré-requisitos

Adicionar funcionalidade de entrada e saída ao seu aplicativo

Nesta seção, você adicionará componentes para dar suporte à funcionalidade de entrada e saída em seu aplicativo Angular. Esses componentes permitem que os usuários autentiquem e gerenciem suas sessões. Você adicionará o roteamento ao aplicativo para direcionar os usuários aos componentes apropriados com base em seu status de autenticação.

Para habilitar a funcionalidade de entrada e saída em seu aplicativo Angular, siga estas etapas:

  1. Abra o arquivo src/app/app.component.html e substitua o conteúdo pelo código a seguir.

    <a class="navbar navbar-dark bg-primary" variant="dark" href="/">
        <a class="navbar-brand"> Microsoft Identity Platform </a>
        <a>
            <button *ngIf="!loginDisplay" class="btn btn-secondary" (click)="login()">Sign In</button>
            <button *ngIf="loginDisplay" class="btn btn-secondary" (click)="logout()">Sign Out</button>
        </a>
    </a>
    <a class="profileButton">
        <a [routerLink]="['profile']" class="btn btn-secondary" *ngIf="loginDisplay">View Profile</a> 
    </a>
    <div class="container">
        <router-outlet></router-outlet>
    </div>
    

    O código implementa uma barra de navegação em um aplicativo Angular. Ele exibe dinamicamente os botões Entrar e Sair com base no status de autenticação do usuário e inclui um botão Exibir Perfil para usuários conectados, aprimorando a interface do usuário do aplicativo. Os métodos login() e logout() no src/app/app.component.ts são chamados quando os botões são selecionados.

  2. Abra o arquivo src/app/app-routing.module.ts e substitua o conteúdo pelo código a seguir.

    // Required for Angular
    import { NgModule } from '@angular/core';
    
    // Required for the Angular routing service
    import { Routes, RouterModule } from '@angular/router';
    
    // Required for the "Profile" page
    import { ProfileComponent } from './profile/profile.component';
    
    // Required for the "Home" page
    import { HomeComponent } from './home/home.component';
    
    // MsalGuard is required to protect routes and require authentication before accessing protected routes
    import { MsalGuard } from '@azure/msal-angular';
    
    // Define the possible routes
    // Specify MsalGuard on routes to be protected
    // '**' denotes a wild card
    const routes: Routes = [
      {
        path: 'profile',
        component: ProfileComponent,
        canActivate: [
          MsalGuard
        ]
      },
      {
        path: '**',
        component: HomeComponent
      }
    ];
    
    // Create an NgModule that contains all the directives for the routes specified above
    @NgModule({
      imports: [RouterModule.forRoot(routes, {
        useHash: true
      })],
      exports: [RouterModule]
    })
    export class AppRoutingModule { }
    

    O trecho de código configura o roteamento em um aplicativo Angular estabelecendo caminhos para os componentes Perfil e Página Inicial. Ele usa MsalGuard para impor a autenticação na rota Perfil, enquanto todos os caminhos incompatíveis são redirecionados para o componente Página Inicial.

  3. Abra o arquivo src/app/home/home.component.ts e substitua o conteúdo pelo código a seguir.

    // Required for Angular
    import { Component, OnInit } from '@angular/core';
    
    // Required for MSAL
    import { MsalBroadcastService, MsalService } from '@azure/msal-angular';
    
    // Required for Angular multi-browser support
    import { EventMessage, EventType, AuthenticationResult } from '@azure/msal-browser';
    
    // Required for RJXS observables
    import { filter } from 'rxjs/operators';
    
    @Component({
      selector: 'app-home',
      templateUrl: './home.component.html'
    })
    export class HomeComponent implements OnInit {
      constructor(
        private authService: MsalService,
        private msalBroadcastService: MsalBroadcastService
      ) { }
    
      // Subscribe to the msalSubject$ observable on the msalBroadcastService
      // This allows the app to consume emitted events from MSAL
      ngOnInit(): void {
        this.msalBroadcastService.msalSubject$
          .pipe(
            filter((msg: EventMessage) => msg.eventType === EventType.LOGIN_SUCCESS),
          )
          .subscribe((result: EventMessage) => {
            const payload = result.payload as AuthenticationResult;
            this.authService.instance.setActiveAccount(payload.account);
          });
      }
    }
    

    O código configura um componente Angular chamado HomeComponent que se integra à MSAL (Biblioteca de Autenticação da Microsoft). No gancho de ciclo de vida ngOnInit, o componente assina o observável msalSubject$ de MsalBroadcastService, filtrando eventos de logon bem-sucedido. Quando ocorre um evento de logon, ele recupera o resultado da autenticação e define a conta ativa no MsalService, permitindo que o aplicativo gerencie sessões de usuário.

  4. Abra o arquivo src/app/home/home.component.html e substitua o conteúdo pelo código a seguir.

    <div class="title">
        <h5>
            Welcome to the Microsoft Authentication Library For JavaScript - Angular SPA
        </h5>
        <p >View your data from Microsoft Graph by clicking the "View Profile" link above.</p>
    </div>
    

    O código recebe os usuários no aplicativo e solicita que eles exibam seus dados do Microsoft Graph clicando no link Exibir Perfil.

  5. Abra o arquivo src/main.ts e substitua o conteúdo pelo código a seguir.

    import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
    
    import { AppModule } from './app/app.module';
    
    platformBrowserDynamic().bootstrapModule(AppModule)
      .catch(err => console.error(err));
    

    O trecho de código importa platformBrowserDynamic do módulo dinâmico do navegador de plataforma do Angular e AppModule do arquivo de módulo do aplicativo. Em seguida, ele usa platformBrowserDynamic() para inicializar o AppModule, inicializando o aplicativo Angular. Todos os erros que ocorrem durante o processo de inicialização são capturados e registrados no console.

  6. Abra o arquivo src/index.html e substitua o conteúdo pelo código a seguir.

    <!doctype html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <title>MSAL For JavaScript - Angular SPA</title>
      </head>
      <body>
        <app-root></app-root>
        <app-redirect></app-redirect>
      </body>
    </html>
    

    O trecho de código define um documento HTML5 com inglês como idioma e codificação de caracteres UTF-8. Ele define o título como "MSAL For JavaScript – Angular SPA". O corpo inclui o <app-root> componente como o ponto de entrada principal e o <app-redirect> componente para funcionalidades de redirecionamento.

  7. Abra o arquivo src/styles.css e substitua o conteúdo pelo código a seguir.

    body {
      margin: 0;
      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
        'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
        sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }
    
    code {
      font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
        monospace;
    }
    
    .app {
      text-align: center;
      padding: 8px;
    }
    
    .title{
      text-align: center;
      padding: 18px;
    }
    
    
    .profile{
      text-align: center;
      padding: 18px;
    }
    
    .profileButton{
      display: flex;
      justify-content: center;
      padding: 18px;
    }
    

    O código CSS define a página da Web definindo a fonte do corpo como uma pilha sans-serif moderna, removendo margens padrão e aplicando suavização de fonte para maior legibilidade. Ele centraliza o texto e adiciona preenchimento às classes .app, .title e .profile, enquanto a classe .profileButton usa flexbox para centralizar seus elementos.

Próxima etapa