Adquisición de un token de acceso en la aplicación web de Node.js
Se aplica a: inquilinos de personal 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
- Complete los pasos de la primera parte de esta serie de guías: Preparación del inquilino externo para llamar a una API en una aplicación web de Node.js.
- Complete los pasos de la segunda parte de esta serie de guías: Preparación de una aplicación para llamar a una API en una aplicación web de Node.js.
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.