Compartir a través de


Tutorial: Creación de una aplicación de página única de React y preparación para la autenticación

Se aplica a:Círculo verde con un símbolo de marca de verificación blanca. inquilinos de personal Círculo verde con un símbolo de marca de verificación blanca. inquilinos externos (más información)

En este tutorial, creará una aplicación de página única (SPA) de React y la preparará para la autenticación mediante la plataforma de identidad de Microsoft. En este tutorial se muestra cómo crear una SPA de React mediante npm, crear archivos necesarios para la autenticación y autorización y agregar los detalles del inquilino al código fuente. La aplicación se puede usar para los empleados de un inquilino del personal o para los clientes que usan un inquilino externo.

En este tutorial, harás lo siguiente:

  • Creación de un nuevo proyecto de React
  • Instalación de paquetes necesarios para la autenticación
  • Crear la estructura de archivos y agregar código al archivo de servidor
  • Adición de los detalles del inquilino al archivo de configuración de autenticación

Prerrequisitos

Creación de un nuevo proyecto de React

  1. Abra Visual Studio Code, seleccione Archivo >Abrir carpeta.... Navegue y seleccione la ubicación en la que se va a crear el proyecto.

  2. Abra una terminal nueva seleccionando Terminal >Crear terminal.

  3. Ejecute los siguientes comandos para crear un nuevo proyecto de React con el nombre reactspalocal, cambie al nuevo directorio e inicie el proyecto de React. Se abrirá un navegador web con la dirección http://localhost:3000/ de forma predeterminada. El explorador permanece abierto y vuelve a representarse para cada cambio guardado.

    npx create-react-app reactspalocal
    cd reactspalocal
    npm start
    
  4. Cree más carpetas y archivos para lograr esta estructura de carpeta:

    ├─── public
    │   └─── index.html
    └───src
        └─── styles
        │   └─── App.css
        │   └─── index.css
        ├─── utils
        │   └─── claimUtils.js
        ├─── components
        │   └─── DataDisplay.jsx
        │   └─── NavigationBar.jsx
        │   └─── PageLayout.jsx
        └── App.jsx
        └── authConfig.js
        └── index.js
    

Instalar los paquetes identity y bootstrap

Los paquetes npm relacionados con la identidad deben instalarse en el proyecto para habilitar la autenticación de usuario. En el caso del estilo del proyecto, se usará Bootstrap .

  1. En la barra Terminal, seleccione el icono + para crear un nuevo terminal. Se abrirá una ventana de terminal independiente con el terminal de nodo anterior que continúa ejecutándose en segundo plano.

  2. Asegúrese de que el directorio correcto está seleccionado (reactspalocal) y, a continuación, escriba lo siguiente en el terminal para instalar los paquetes msal y bootstrap pertinentes.

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

Adición de los detalles del inquilino a la configuración de MSAL

El archivo authConfig.js contiene las opciones de configuración del flujo de autenticación y se usa para configurar MSAL.js con los valores necesarios para la autenticación.

  1. En la carpeta src, abra authConfig.js y agregue el siguiente fragmento de código:

    
     import { LogLevel } from '@azure/msal-browser';
    
     /**
     * Configuration object to be passed to MSAL instance on creation. 
     * For a full list of MSAL.js configuration parameters, visit:
     * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/configuration.md 
     */
    
     export const msalConfig = {
         auth: {
             clientId: 'Enter_the_Application_Id_Here', // This is the ONLY mandatory field that you need to supply.
             authority: 'https://login.microsoftonline.com/Enter_the_Tenant_Info_Here', // Replace the placeholder with your tenant info
             redirectUri: 'http://localhost:3000/redirect', // Points to window.___location.origin. You must register this URI on Microsoft Entra admin center/App Registration.
             postLogoutRedirectUri: '/', // Indicates the page to navigate after logout.
             navigateToLoginRequestUrl: false, // If "true", will navigate back to the original request ___location before processing the auth code response.
         },
         cache: {
             cacheLocation: 'sessionStorage', // Configures cache ___location. "sessionStorage" is more secure, but "localStorage" gives you SSO between tabs.
             storeAuthStateInCookie: false, // Set this to "true" if you are having issues on IE11 or Edge
         },
         system: {
             loggerOptions: {
                 loggerCallback: (level, message, containsPii) => {
                     if (containsPii) {
                         return;
                     }
                     switch (level) {
                         case LogLevel.Error:
                             console.error(message);
                             return;
                         case LogLevel.Info:
                             console.info(message);
                             return;
                         case LogLevel.Verbose:
                             console.debug(message);
                             return;
                         case LogLevel.Warning:
                             console.warn(message);
                             return;
                         default:
                             return;
                     }
                 },
             },
         },
     };
    
     /**
     * Scopes you add here will be prompted for user consent during sign-in.
     * By default, MSAL.js will add OIDC scopes (openid, profile, email) to any login request.
     * For more information about OIDC scopes, visit: 
     * https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent#openid-connect-scopes
     */
     export const loginRequest = {
         scopes: [],
     };
    
     /**
     * An optional silentRequest object can be used to achieve silent SSO
     * between applications by providing a "login_hint" property.
     */
     // export const silentRequest = {
     //     scopes: ["openid", "profile"],
     //     loginHint: "example@___domain.net"
     // };
    
  2. Reemplace los siguientes valores por los del Centro de administración de Microsoft Entra.

    • clientId: el identificador de la aplicación, también conocido como el cliente. Reemplace Enter_the_Application_Id_Here por el valor de Id. de la aplicación (cliente) que se registró anteriormente en la página de resumen de la aplicación registrada.
    • authority - Se compone de dos partes:
      • La instancia es el punto de conexión del proveedor de nube. Consulte los diferentes puntos de conexión disponibles en nubes nacionales.
      • El Id. de inquilino es el identificador del inquilino en el que está registrada la solicitud. Reemplace Enter_the_Tenant_Info_Here por el valor de Identificador del directorio (inquilino) que se ha registrado antes en la página de información general de la aplicación registrada.
  3. Guarde el archivo.

Adición del proveedor de autenticación

Los msal paquetes se usan para proporcionar autenticación en la aplicación. El msal-browser paquete se usa para controlar el flujo de autenticación y el msal-react paquete se usa para integrarse msal-browser con React. addEventCallback se usa para escuchar eventos que se producen durante el proceso de autenticación, como cuando un usuario inicia sesión correctamente. El setActiveAccount método se usa para establecer la cuenta activa de la aplicación, que se usa para determinar la información del usuario que se va a mostrar.

  1. En la carpeta src, abra index.js y reemplace el contenido del archivo por el siguiente fragmento de código para usar los msal paquetes y el estilo de arranque:

    import React from 'react';
    import { createRoot } from 'react-dom/client';
    import App from './App';
    import { PublicClientApplication, EventType } from '@azure/msal-browser';
    import { msalConfig } from './authConfig';
    
    import 'bootstrap/dist/css/bootstrap.min.css';
    import './styles/index.css';
    
    /**
    * MSAL should be instantiated outside of the component tree to prevent it from being re-instantiated on re-renders.
    * For more, visit: https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-react/docs/getting-started.md
    */
    const msalInstance = new PublicClientApplication(msalConfig);
    
    // Default to using the first account if no account is active on page load
    if (!msalInstance.getActiveAccount() && msalInstance.getAllAccounts().length > 0) {
        // Account selection logic is app dependent. Adjust as needed for different use cases.
        msalInstance.setActiveAccount(msalInstance.getAllAccounts()[0]);
    }
    
    // Listen for sign-in event and set active account
    msalInstance.addEventCallback((event) => {
        if (event.eventType === EventType.LOGIN_SUCCESS && event.payload.account) {
            const account = event.payload.account;
            msalInstance.setActiveAccount(account);
        }
    });
    
    const root = createRoot(document.getElementById('root'));
    root.render(
        <App instance={msalInstance}/>
    );
    
  2. Guarde el archivo.

Para obtener más información sobre estos paquetes, consulte la documentación de msal-browser y msal-react.

Adición del componente de aplicación principal

Todas las partes de la aplicación que requieren autenticación se deben encapsular en el componente MsalProvider. Estableces una variable instance que llama al hook useMsal para obtener la instancia PublicClientApplication y luego la pasas a MsalProvider. El componente MsalProvider hace que la instancia PublicClientApplication esté disponible en toda tu aplicación a través de la API de contexto de React. Todos los componentes debajo de MsalProvider tendrán acceso a la instancia mediante el contexto de PublicClientApplication, así como a todos los hooks y componentes que proporciona msal-react.

  1. En la carpeta src , abra App.jsx y reemplace el contenido del archivo por el siguiente fragmento de código:

    import { MsalProvider, AuthenticatedTemplate, useMsal, UnauthenticatedTemplate } from '@azure/msal-react';
    import { Container, Button } from 'react-bootstrap';
    import { PageLayout } from './components/PageLayout';
    import { IdTokenData } from './components/DataDisplay';
    import { loginRequest } from './authConfig';
    
    import './styles/App.css';
    
    /**
    * Most applications will need to conditionally render certain components based on whether a user is signed in or not. 
    * msal-react provides 2 easy ways to do this. AuthenticatedTemplate and UnauthenticatedTemplate components will 
    * only render their children if a user is authenticated or unauthenticated, respectively. For more, visit:
    * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-react/docs/getting-started.md
    */
    const MainContent = () => {
        /**
        * useMsal is hook that returns the PublicClientApplication instance,
        * that tells you what msal is currently doing. For more, visit:
        * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-react/docs/hooks.md
        */
        const { instance } = useMsal();
        const activeAccount = instance.getActiveAccount();
    
        const handleRedirect = () => {
            instance
                .loginRedirect({
                    ...loginRequest,
                    prompt: 'create',
                })
                .catch((error) => console.log(error));
        };
        return (
            <div className="App">
                <AuthenticatedTemplate>
                    {activeAccount ? (
                        <Container>
                            <IdTokenData idTokenClaims={activeAccount.idTokenClaims} />
                        </Container>
                    ) : null}
                </AuthenticatedTemplate>
                <UnauthenticatedTemplate>
                    <Button className="signInButton" onClick={handleRedirect} variant="primary">
                        Sign up
                    </Button>
                </UnauthenticatedTemplate>
            </div>
        );
    };
    
    
    /**
    * msal-react is built on the React context API and all parts of your app that require authentication must be 
    * wrapped in the MsalProvider component. You will first need to initialize an instance of PublicClientApplication 
    * then pass this to MsalProvider as a prop. All components underneath MsalProvider will have access to the 
    * PublicClientApplication instance via context as well as all hooks and components provided by msal-react. For more, visit:
    * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-react/docs/getting-started.md
    */
    const App = ({ instance }) => {
        return (
            <MsalProvider instance={instance}>
                <PageLayout>
                    <MainContent />
                </PageLayout>
            </MsalProvider>
        );
    };
    
    export default App;
    
  2. Guarde el archivo.

Pasos siguientes