Compartilhar via


Tutorial: Adicionar fluxos de entrada e de saída a um aplicativo de página única javaScript

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 símbolo de marca de seleção branca. Locatários externos (saiba mais)

Neste tutorial, você configurará um SPA (aplicativo de página única) JavaScript para autenticação. Na parte 1 desta série, você criou um SPA JavaScript e o preparou para autenticação. Neste tutorial, você aprenderá a adicionar fluxos de autenticação adicionando componentes da MSAL (Biblioteca de Autenticação da Microsoft) ao seu aplicativo e criará uma interface do usuário (interface do usuário) responsiva para seu aplicativo.

Neste tutorial;

  • Adicionar código a auth.js para lidar com o fluxo de autenticação
  • Criar uma interface do usuário para o aplicativo

Pré-requisitos

Adicionar código ao arquivo de redirecionamento

Um fluxo de autenticação é uma série de etapas que um aplicativo executa para autenticar um usuário. Auth.js contém funções usadas para lidar com o fluxo de autenticação, incluindo entrar e sair usando o método de redirecionamento ou pop-up.

  1. Abra public/auth.js e adicione o seguinte código:

    // Browser check variables: If you support IE, our recommendation is to sign-in using Redirect APIs. If you are testing using Edge InPrivate mode, please add "isEdge" to the if check.
    const ua = window.navigator.userAgent;
    const msie = ua.indexOf("MSIE ");
    const msie11 = ua.indexOf("Trident/");
    const msedge = ua.indexOf("Edge/");
    const isIE = msie > 0 || msie11 > 0;
    const isEdge = msedge > 0;
    
    let signInType;
    let accountId = "";
    
    // myMSALObj instance - configuration parameters are located at authConfig.js
    const myMSALObj = new msal.PublicClientApplication(msalConfig);
    
    myMSALObj.initialize().then(() => {
        // Redirect: once login is successful and redirects with tokens, call Graph API
        myMSALObj.handleRedirectPromise().then(handleResponse).catch(err => {
            console.error(err);
        });
    })
    
    function selectAccount() {
    
        /**
        * See here for more info on account retrieval: 
        * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-common/docs/Accounts.md
        */
    
        const currentAccounts = myMSALObj.getAllAccounts();
    
        if (!currentAccounts) {
            return;
        } else if (currentAccounts.length > 1) {
            // Add your account choosing logic here
            console.warn("Multiple accounts detected.");
        } else if (currentAccounts.length === 1) {
            username = currentAccounts[0].username
            showWelcomeMessage(currentAccounts[0].username);
            updateTable(currentAccounts[0]);
        }
    }
    
    function handleResponse(resp) {
        if (resp !== null) {
            accountId = resp.account.homeAccountId;
            myMSALObj.setActiveAccount(resp.account);
            showWelcomeMessage(resp.account);
        } else {
                selectAccount();
            } 
        }
    
    async function signIn(method) {
        signInType = isIE ? "redirect" : method;
        if (signInType === "popup") {
            return myMSALObj.loginPopup({
                ...loginRequest,
                redirectUri: "/redirect"
            }).then(handleResponse).catch(function (error) {
                console.log(error);
            });
        } else if (signInType === "redirect") {
            return myMSALObj.loginRedirect(loginRequest)
        }
    }
    
    function signOut(interactionType) {
        const logoutRequest = {
            account: myMSALObj.getAccountByHomeId(accountId)
        };
    
        if (interactionType === "popup") {
            myMSALObj.logoutPopup(logoutRequest).then(() => {
                window.location.reload();
            });
        } else {
            myMSALObj.logoutRedirect(logoutRequest);
        }
    }
    
    // This function can be removed if you do not need to support IE
    async function getTokenRedirect(request, account) {
        return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
            console.log("silent token acquisition fails.");
            if (error instanceof msal.InteractionRequiredAuthError) {
                // fallback to interaction when silent call fails
                console.log("acquiring token using redirect");
                myMSALObj.acquireTokenRedirect(request);
            } else {
                console.error(error);
            }
        });
    }
    
  2. Salve o arquivo.

Criar uma interface do usuário para o aplicativo

Quando a autorização foi configurada, uma interface do usuário pode ser criada para interagir com o aplicativo quando o projeto é executado. O Bootstrap é usado para criar uma interface do usuário responsiva que contém um botão entrar e sair . A interface do usuário também contém uma tabela que exibe as declarações do token, que serão adicionadas posteriormente no tutorial.

Adicione código ao arquivo index.html.

A página principal do SPA, index.html, é a primeira página carregada quando o aplicativo é iniciado. Também é a página carregada quando o usuário seleciona o botão Sair. A página contém uma barra de navegação, uma mensagem de boas-vindas com o email dos usuários e uma tabela que exibe as declarações do token.

  1. Abra index.html e adicione o seguinte snippet de código:

     <!DOCTYPE html>
     <html lang="en">
    
     <head>
         <meta charset="UTF-8">
         <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
         <title>Microsoft identity platform</title>
         <link rel="SHORTCUT ICON" href="./favicon.svg" type="image/x-icon">
         <link rel="stylesheet" href="./styles.css">
    
         <!-- adding Bootstrap 5 for UI components  -->
         <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet"
             integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
         <!-- msal.min.js can be used in the place of msal-browser.js -->
         <script src="/msal-browser.min.js"></script>
     </head>
    
     <!DOCTYPE html>
     <html lang="en">
     <head>
     <meta charset="UTF-8">
     <title>Bootstrap 5 Navbar</title>
     <!-- Bootstrap 5 CSS -->
     <link 
         href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" 
         rel="stylesheet" 
         integrity="sha384-Zenh87qX5JnK2Rl3l94faQlfdS3b8SpxyDkgOn+Y5Qu3og6JpNZnN9LfX9k8wAI5" 
         crossorigin="anonymous">
     </head>
    
     <body>
     <!-- Navbar -->
     <nav class="navbar navbar-expand-sm navbar-dark bg-primary navbarStyle">
         <a class="navbar-brand" href="/">Microsoft identity platform</a>
    
         <div class="ms-auto d-flex align-items-center">
         <!-- Dropdown group (Bootstrap 5 uses dropstart instead of dropleft) -->
         <div class="btn-group dropstart">
             <!-- Toggle button for dropdown -->
             <button
             id="signIn"
             type="button"
             class="btn btn-primary dropdown-toggle"
             data-bs-toggle="dropdown"
             aria-expanded="false"
             >
             Sign In
             </button>
    
             <!-- Dropdown menu -->
             <div class="dropdown-menu">
             <button class="dropdown-item" id="popup" onclick="signIn(this.id)">
                 Sign in using Popup
             </button>
             <button class="dropdown-item" id="redirect" onclick="signIn(this.id)">
                 Sign in using Redirect
             </button>
             </div>
         </div>
    
         <!-- Sign Out button -->
         <button class="btn btn-secondary ms-2" id="signOut" onclick="signOut()">
             Sign Out
         </button>
         </div>
     </nav>
    
    
     <br />
     <div class="container">
         <div class="row">
         <h5 id="title-div" class="card-header text-center">
             JavaScript single-page application secured with MSAL.js
         </h5>
         <br />
         <h5 id="welcome-div" class="card-header text-center d-none"></h5>
    
         <table class="table table-striped table-bordered d-none" id="table-div">
             <thead>
             <tr>
                 <th>Claim Type</th>
                 <th>Value</th>
                 <th>Description</th>
             </tr>
             </thead>
             <tbody id="table-body-div"></tbody>
         </table>
         </div>
     </div>
    
     <script 
         src="https://code.jquery.com/jquery-3.3.1.slim.min.js" 
         integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" 
         crossorigin="anonymous">
     </script>
    
     <!-- Bootstrap 5 JS bundle (includes Popper) -->
     <script 
         src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" 
         integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" 
         crossorigin="anonymous">
     </script>
    
     <!-- Your custom scripts -->
     <script type="text/javascript" src="./authConfig.js"></script>
     <script type="text/javascript" src="./ui.js"></script>
     <script type="text/javascript" src="./claimUtils.js"></script>
     <script type="text/javascript" src="./auth.js"></script>
     </body>
     </html>
    
  2. Salve o arquivo.

Adicione código ao arquivo ui.js

Para tornar seu aplicativo interativo, o arquivo ui.js é usado para lidar com elementos de interface do usuário do aplicativo. O arquivo contém funções que são usadas para atualizar o nome do usuário quando ele entra e para atualizar a tabela com as declarações do token.

  1. Abra public/ui.js e adicione o seguinte snippet de código:

    // Select DOM elements to work with
    const signInButton = document.getElementById('signIn');
    const signOutButton = document.getElementById('signOut');
    const titleDiv = document.getElementById('title-div');
    const welcomeDiv = document.getElementById('welcome-div');
    const tableDiv = document.getElementById('table-div');
    const tableBody = document.getElementById('table-body-div');
    
    function showWelcomeMessage(account) {
        signInButton.classList.add('d-none');
        signOutButton.classList.remove('d-none');
        titleDiv.classList.add('d-none');
        welcomeDiv.classList.remove('d-none');
        welcomeDiv.innerHTML = `Welcome ${account.username}!`;
        updateTable(account);
    };
    
    function updateTable(account) {
        tableDiv.classList.remove('d-none');
    
        const tokenClaims = createClaimsTable(account.idTokenClaims);
    
        Object.keys(tokenClaims).forEach((key) => {
            let row = tableBody.insertRow(0);
            let cell1 = row.insertCell(0);
            let cell2 = row.insertCell(1);
            let cell3 = row.insertCell(2);
            cell1.innerHTML = tokenClaims[key][0];
            cell2.innerHTML = tokenClaims[key][1];
            cell3.innerHTML = tokenClaims[key][2];
        });
    };
    
  2. Salve o arquivo.

Adicionar código ao arquivo signout.html

O arquivo signout.html é usado para exibir uma mensagem para o usuário quando ele sai do aplicativo.

  1. Abra signout.html e adicione o seguinte snippet de código:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Microsoft Entra ID | JavaScript SPA</title>
        <link rel="SHORTCUT ICON" href="./favicon.svg" type="image/x-icon">
    
        <!-- adding Bootstrap 4 for UI components  -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    </head>
    <body>
        <div class="jumbotron" style="margin: 10%">
            <h1>Goodbye!</h1>
            <p>You have signed out and your cache has been cleared.</p>
            <a class="btn btn-primary" href="/" role="button">Take me back</a>
        </div>
    </body>
    </html>
    
  2. Salve o arquivo.

Adicionar estilos ao aplicativo

Por fim, adicione alguns estilos ao aplicativo para torná-lo mais atraente. Os estilos são adicionados ao arquivo styles.css e podem ser personalizados de acordo com suas necessidades.

  1. Abra styles.css e adicione o seguinte snippet de código:

    .navbarStyle {
        padding: .5rem 1rem !important;
    }
    
    .table-responsive-ms {
        max-height: 39rem !important;
        padding-left: 10%;
        padding-right: 10%;
    }
    
  2. Salve o arquivo.

Próxima etapa