Compartir vía


Adquisición de un token de acceso en la aplicación web de Node.js

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

En este artículo, actualizará el código para permitir que la aplicación web adquiera un token de acceso. Use la Biblioteca de autenticación de Microsoft (MSAL) para Node para simplificar la adición de la autenticación y la autorización a la aplicación web del nodo. Este artículo es la tercera parte de una serie de guías de cuatro partes.

Requisitos previos

Actualización del objeto de configuración de MSAL

En el editor de código, abra el archivo authConfig.js y, a continuación, actualice el código agregando el objeto protectedResources:

    //..   
    const toDoListReadScope = process.env.TODOLIST_READ || 'api://Enter_the_Web_Api_Application_Id_Here/ToDoList.Read';
    const toDoListReadWriteScope = process.env.TODOLIST_READWRITE || 'api://Enter_the_Web_Api_Application_Id_Here/ToDoList.ReadWrite';
    
    const protectedResources = {
        toDoListAPI: {
            endpoint: 'https://localhost:44351/api/todolist',
            scopes: {
                read: [toDoListReadScope],
                write: [toDoListReadWriteScope],
            },
        },
    };    
    module.exports = {
        //..
        protectedResources,
        //..
    };

En el archivo authConfig.js, reemplace Enter_the_Web_Api_Application_Id_Here por el identificador de aplicación (cliente) de la aplicación de API web que registró en el inquilino del cliente.

Las variables todolistReadScope y todolistReadWriteScope contienen las direcciones URL de ámbito completo de la API web que estableció en el inquilino externo. Asegúrese de exportar el objeto protectedResources.

Adquirir token de acceso

En el editor de código, abra el archivo auth/AuthProvider.js y actualice el método getToken en la clase AuthProvider:

    const axios = require('axios');
    class AuthProvider {
    //...
        getToken(scopes) {
            return  async function (req, res, next) {
                const msalInstance = authProvider.getMsalInstance(authProvider.config.msalConfig);
                try {
                    msalInstance.getTokenCache().deserialize(req.session.tokenCache);
    
                    const silentRequest = {
                        account: req.session.account,
                        scopes: scopes,
                    };
    
                    const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
    
                    req.session.tokenCache = msalInstance.getTokenCache().serialize();
                    req.session.accessToken = tokenResponse.accessToken;
                    next();
                } catch (error) {
                    if (error instanceof msal.InteractionRequiredAuthError) {
                        req.session.csrfToken = authProvider.cryptoProvider.createNewGuid();
    
                        const state = authProvider.cryptoProvider.base64Encode(
                            JSON.stringify({
                                redirectTo: 'http://localhost:3000/todos',
                                csrfToken: req.session.csrfToken,
                            })
                        );
                        
                        const authCodeUrlRequestParams = {
                            state: state,
                            scopes: scopes,
                        };
    
                        const authCodeRequestParams = {
                            state: state,
                            scopes: scopes,
                        };
    
                        authProvider.redirectToAuthCodeUrl(
                            req,
                            res,
                            next,
                            authCodeUrlRequestParams,
                            authCodeRequestParams,
                            msalInstance
                        );
                    }
    
                    next(error);
                }
            };
        }
    //...
    }
  • En primer lugar, la función intenta adquirir un token de acceso de forma silenciosa (sin solicitar al usuario las credenciales):

    const silentRequest = {
        account: req.session.account,
        scopes: scopes,
    };
    
    const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
    
  • Si adquiere correctamente un token de forma silenciosa, almacénelo en una sesión. El token se recupera desde la sesión al llamar a una API.

    req.session.accessToken = tokenResponse.accessToken;
    
  • Si no puede adquirir el token de forma silenciosa (por ejemplo, con la excepción InteractionRequiredAuthError), solicite un token de acceso de nuevo.

Nota:

Una vez que la aplicación cliente recibe un token de acceso, debe tratarla como una cadena opaca. El token de acceso está pensado para la API, no para la aplicación cliente. Por lo tanto, la aplicación cliente no debe intentar leer ni procesar el token de acceso. En su lugar, debe incluir el token de acceso tal como está en el encabezado de Authorization de sus solicitudes a la API. La API es responsable de interpretar el token de acceso y usarlo para autenticar y autorizar las solicitudes de la aplicación cliente.

Paso siguiente