Tenemos un microservicio, compuesto en JavaScript, que necesita consumir un segundo microservicio. El segundo microservicio requiere que la aplicación de consumo proporcione un token JWT que afirma
"roles": [ "FooBar.Read" ],para obtener permiso para usar el servicio.
En lugar de reinventar la rueda al llamar a Azure Active Directory para obtener y almacenar en caché el token, nos gustaría utilizar el paquete de nodos de la biblioteca de autenticación de Microsoft.
Creo que probablemente queramos usar el método acquireTokenSilent() de ConfidentialClientApplication , pero no tengo del todo claro cómo crear la solicitud.
He creado este módulo:
import msal from '@azure/msal-node'; import {cachePlugin} from 'token-cache'; const confidentialClient = new msal.ConfidentialClientApplication({ auth: { authority: `${process.env.AZURE_ACTIVE_DIRECTORY_AUTHORITY_URI}/${process.env.AZURE_ACTIVE_DIRECTORY_TENANT_ID}`, clientId: process.env.AZURE_ACTIVE_DIRECTORY_CLIENT_ID, clientSecret: process.env.AZURE_ACTIVE_DIRECTORY_CLIENT_SECRET, knownAuthorities: [], }, cache: { cachePlugin, }, system: { loggerOptions: { loggerCallback(loglevel, message) { console.log(message); }, piiLoggingEnabled: false, logLevel: msal.LogLevel.Verbose, }, }, }); const silentFlowRequest = { account: { tenantId: process.env.AZURE_ACTIVE_DIRECTORY_TENANT_ID, username: process.env.AZURE_ACTIVE_DIRECTORY_USERNAME, password: process.env.AZURE_ACTIVE_DIRECTORY_PASSWORD, }, scopes: [process.env.AZURE_ACTIVE_DIRECTORY_EMPLOYEE_MANAGEMENT_SCOPE] }; async function acquireToken() { try { return await confidentialClient.acquireTokenSilent(silentFlowRequest) } catch (error) { console.error(error); } } module.exports = { acquireToken };Sin embargo, espero que falle porque Intell-J me dice:
El tipo de argumento {scopes: string[], account: {password: string, tenantId: string, username: string}} no se puede asignar al tipo de parámetro SilentFlowRequest
¿Cuál es la forma correcta de hacer esto?
Gracias por comunicarse con nosotros, siga el documento: https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/AcquireTokenSilentAsync-using-a-cached-token#recommended-pattern-to- adquirir-un-token .
Espero que esto te ayudará.
Puede usar la concesión de credenciales de cliente de MSAL mediante un secreto de cliente para adquirir tokens para su API web. Tenemos un ejemplo de código con un README bastante explicativo aquí .
La concesión de credenciales de cliente primero adquiere un token (a través de ConfidentialClientApplicaiton.acquireTokenByClientCredentials ) y realiza una solicitud de red a AzureAD. Una vez que se adquiere el token, MSAL lo almacena en caché automáticamente y las llamadas posteriores devolverán el mismo token del caché hasta que caduque, momento en el cual MSAL actualizará el token por usted.
// Create msal application object const confidentialClientApplication = new msal.ConfidentialClientApplication( { authOptions: { clientId: "<ENTER_CLIENT_ID>", authority: "https://login.microsoftonline.com/<ENTER_TENANT_ID>", clientSecret: "<ENTER_CLIENT_SECRET>" } }); // Acquire tokens function getClientCredentialsToken(confidentialClientApplication, scopes) { // With client credentials flows permissions need to be granted in the portal by a tenant administrator. // The scope is always in the format "<resource>/.default" const clientCredentialRequest = { scopes: scopes }; return confidentialClientApplication .acquireTokenByClientCredential(clientCredentialRequest) .then((response) => { // Handle response }).catch((error) => { // Handle error }); }Básicamente, crea un secreto de cliente en Azure Portal y luego lo coloca en su configuración de MSAL. Este secreto se usa en lugar de las credenciales de usuario, lo que permite que su aplicación se autentique con AzureAD y adquiera tokens sin interacción del usuario.